From 021bed5f5de02a9262831ebcb968a627f2ddba26 Mon Sep 17 00:00:00 2001 From: Jittapan Pluemsumran Date: Sun, 21 Aug 2016 14:30:17 +0700 Subject: [PATCH 01/16] Implemented status reduction potion support * New script command `needed_status_point` added. * The items are not yet implemented. --- doc/script_commands.txt | 8 ++++++++ npc/other/CashShop_Functions.txt | 20 ++++++++++++++++++++ src/map/script.c | 17 +++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 336c1a1ea0..6d3d68eb51 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -4294,6 +4294,14 @@ This command will force a stat recalculation for the attached player. --------------------------------------- +*needed_status_point(,{,}); + +Returns the number of stat points needed to change the specified stat by . +If is negative, returns the number of stat points that would be needed to +raise the specified stat from (current value - ) to current value. + +--------------------------------------- + *get_revision() This command will return the SVN revision number that the server is currently diff --git a/npc/other/CashShop_Functions.txt b/npc/other/CashShop_Functions.txt index e1640ec1b3..2c0fa037a2 100644 --- a/npc/other/CashShop_Functions.txt +++ b/npc/other/CashShop_Functions.txt @@ -304,3 +304,23 @@ function script F_Snowball { } end; } + +// Status reduction potion +//============================================================ +// - Permanently reduces base stat by 1. +// - Returns status points equals to points needed to raise +// that stat to original value. +// - Doesn't work if base status is already 1. +// * callfunc("F_CashReduceStat",{,}); +function script F_CashReduceStat { + .@type = getarg(0); + .@itemid = getarg(1, 0); + + if(readparam(.@type) < 2) return; + + if(.@itemid) + delitem .@itemid,1; + StatusPoint += needed_status_point(.@type, -1); + statusup2 .@type,-1; + return; +} diff --git a/src/map/script.c b/src/map/script.c index eed2047318..6f1e0d0e31 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -21661,6 +21661,22 @@ BUILDIN_FUNC(setrandomoption) { return SCRIPT_CMD_FAILURE; } +/// Returns the number of stat points needed to change the specified stat by val. +/// If val is negative, returns the number of stat points that would be needed to +/// raise the specified stat from (current value - val) to current value. +/// *needed_status_point(,{,}); +/// @author [secretdataz] +BUILDIN_FUNC(needed_status_point) { + struct map_session_data *sd; + int type, val; + if (!script_charid2sd(4, sd)) + return SCRIPT_CMD_FAILURE; + type = script_getnum(st, 2); + val = script_getnum(st, 3); + + script_pushint(st, pc_need_status_point(sd, type, val)); + return SCRIPT_CMD_SUCCESS; +} #include "../custom/script.inc" // declarations that were supposed to be exported from npc_chat.c @@ -22243,6 +22259,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(getrandomoptinfo, "i"), BUILDIN_DEF(getequiprandomoption, "iii?"), BUILDIN_DEF(setrandomoption,"iiiii?"), + BUILDIN_DEF(needed_status_point,"ii?"), #include "../custom/script_def.inc" From 472b885ca83627922d2c2208b46ff6d9b8308a7d Mon Sep 17 00:00:00 2001 From: Jittapan Pluemsumran Date: Sun, 21 Aug 2016 18:06:26 +0700 Subject: [PATCH 02/16] Follow up to 021bed5f5de02a9262831ebcb968a627f2ddba26 --- npc/other/CashShop_Functions.txt | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/npc/other/CashShop_Functions.txt b/npc/other/CashShop_Functions.txt index 2c0fa037a2..2ede408917 100644 --- a/npc/other/CashShop_Functions.txt +++ b/npc/other/CashShop_Functions.txt @@ -307,20 +307,24 @@ function script F_Snowball { // Status reduction potion //============================================================ -// - Permanently reduces base stat by 1. +// - Permanently reduces base stat by . // - Returns status points equals to points needed to raise // that stat to original value. -// - Doesn't work if base status is already 1. -// * callfunc("F_CashReduceStat",{,}); +// - Doesn't work if base status would become lower than 1 after reduction. +// * callfunc("F_CashReduceStat",{,,}); function script F_CashReduceStat { .@type = getarg(0); - .@itemid = getarg(1, 0); + .@amount = getarg(1, -1); + .@itemid = getarg(2, 0); - if(readparam(.@type) < 2) return; + if((readparam(.@type) + .@amount) < 1) return; if(.@itemid) - delitem .@itemid,1; - StatusPoint += needed_status_point(.@type, -1); - statusup2 .@type,-1; + if(countitem(.@itemid)) + delitem .@itemid,1; + else + return; + StatusPoint += needed_status_point(.@type, .@amount); + statusup2 .@type,.@amount; return; } From eb8ea91f5b62181b2108d7727ce2635dc19208ef Mon Sep 17 00:00:00 2001 From: Jittapan Pluemsumran Date: Mon, 22 Aug 2016 22:44:13 +0700 Subject: [PATCH 03/16] Follow up to 472b885ca83627922d2c2208b46ff6d9b8308a7d * Added brackets after if --- npc/other/CashShop_Functions.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/npc/other/CashShop_Functions.txt b/npc/other/CashShop_Functions.txt index 2ede408917..c8ce283ae1 100644 --- a/npc/other/CashShop_Functions.txt +++ b/npc/other/CashShop_Functions.txt @@ -319,11 +319,12 @@ function script F_CashReduceStat { if((readparam(.@type) + .@amount) < 1) return; - if(.@itemid) + if(.@itemid) { if(countitem(.@itemid)) delitem .@itemid,1; else return; + } StatusPoint += needed_status_point(.@type, .@amount); statusup2 .@type,.@amount; return; From 78bc0a613145f063b2e9c4a41091c0009d9b4dd5 Mon Sep 17 00:00:00 2001 From: Cydh Ramdh Date: Wed, 24 Aug 2016 15:35:38 +0700 Subject: [PATCH 04/16] Follow up f296409ada211a0aa89863db4d9603054845cf65 Signed-off-by: Cydh Ramdh --- vcproj-10/map-server.vcxproj | 1 + vcproj-12/map-server.vcxproj | 1 + vcproj-13/map-server.vcxproj | 1 + vcproj-14/map-server.vcxproj | 1 + 4 files changed, 4 insertions(+) diff --git a/vcproj-10/map-server.vcxproj b/vcproj-10/map-server.vcxproj index f3b349c229..21460d653b 100644 --- a/vcproj-10/map-server.vcxproj +++ b/vcproj-10/map-server.vcxproj @@ -319,6 +319,7 @@ + diff --git a/vcproj-12/map-server.vcxproj b/vcproj-12/map-server.vcxproj index 3d6c131074..e6e8bd3e85 100644 --- a/vcproj-12/map-server.vcxproj +++ b/vcproj-12/map-server.vcxproj @@ -323,6 +323,7 @@ + diff --git a/vcproj-13/map-server.vcxproj b/vcproj-13/map-server.vcxproj index bd8f237c0d..781402cc52 100644 --- a/vcproj-13/map-server.vcxproj +++ b/vcproj-13/map-server.vcxproj @@ -323,6 +323,7 @@ + diff --git a/vcproj-14/map-server.vcxproj b/vcproj-14/map-server.vcxproj index 44e581b342..45546eff48 100644 --- a/vcproj-14/map-server.vcxproj +++ b/vcproj-14/map-server.vcxproj @@ -321,6 +321,7 @@ + From 6bcfc18f6fea4749e1a1366447eccd6732301db8 Mon Sep 17 00:00:00 2001 From: Jittapan Pluemsumran Date: Wed, 24 Aug 2016 20:17:24 +0700 Subject: [PATCH 05/16] Updated some AegisName to official name --- db/re/item_db.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index ff13437184..3d4118f471 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -2751,13 +2751,13 @@ 4571,Gertie_Card,Gertie Card,6,20,,10,,,,,,,,4,,,,,{ bonus bFlee,10; skill "RG_CLOSECONFINE",1; },{},{} 4572,Randel_Card,Randel Card,6,20,,10,,,,,,,,4,,,,,{ bonus bFlee,10; skill "CR_AUTOGUARD",3; },{},{} 4573,Trentini_Card,Trentini Card,6,20,,10,,,,,,,,4,,,,,{ bonus bFlee,10; if(BaseJob==Job_Dancer) { bonus bMaxHPrate,10; bonus bMaxSPrate,5;} },{},{} -4574,General_Daehyon_Card,General Daehyon Card,6,20,,10,,,,,,,,2,,,,,{ .@i = getiteminfo(getequipid(EQI_HAND_R),11); if(.@i==W_1HSWORD||.@i==W_2HSWORD) { bonus bBaseAtk,100; } },{},{} -4575,Armed_Guard_Soheon_Card,Armed Guard Soheon Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,10; if(getiteminfo(getequipid(EQI_HAND_R),11) == W_DAGGER) { .@r = getrefine(); if(.@r>=10) { bonus bAspd,1; } if(.@r>=14) { bonus bAspd,1; } } },{},{} +4574,Daehyon_Card,General Daehyon Card,6,20,,10,,,,,,,,2,,,,,{ .@i = getiteminfo(getequipid(EQI_HAND_R),11); if(.@i==W_1HSWORD||.@i==W_2HSWORD) { bonus bBaseAtk,100; } },{},{} +4575,Soheon_Card,Armed Guard Soheon Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,10; if(getiteminfo(getequipid(EQI_HAND_R),11) == W_DAGGER) { .@r = getrefine(); if(.@r>=10) { bonus bAspd,1; } if(.@r>=14) { bonus bAspd,1; } } },{},{} 4576,Gioia_Card,Gioia Card,6,20,,10,,,,,,,,4,,,,,{ bonus2 bMagicAtkEle,Ele_Wind,100; bonus2 bMagicAtkEle,Ele_Ghost,100; bonus2 bSubEle,Ele_All,-30; },{},{} 4577,Elvira_Card,Elvira Card,6,20,,10,,,,,,,,136,,,,,{ bonus2 bMagicAtkEle,Ele_Wind,20; bonus2 bMagicAtkEle,Ele_Ghost,20; },{},{} -4578,Angry_Student_Pyuriel_Card,Angry Student Pyuriel Card,6,20,,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,30; bonus2 bSubRace,RC_All,-10; bonus2 bSubRace,RC_Player,10; },{},{} -4579,Warrior_Lola_Card,Warrior Lola Card,6,20,,10,,,,,,,,2,,,,,{ if(getiteminfo(getequipid(EQI_HAND_R),11) == W_MACE) { bonus bBaseAtk,20; bonus bCritical,10; } .@r = getrefine(); bonus bBaseAtk,.@r; bonus bCritical,.@r; },{},{} -4580,Dark_Guardian_Kades_Card,Dark Guardian Kades Card,6,20,,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Water,50; bonus2 bSubEle,Ele_Earth,50; bonus2 bSubEle,Ele_Fire,50; bonus2 bSubEle,Ele_Wind,50; bonus2 bSubEle,Ele_Dark,50; bonus2 bSubEle,Ele_Undead,50; bonus2 bSubEle,Ele_Holy,-100; bonus2 bSubEle,Ele_Ghost,-100; },{},{} +4578,Pyuriel_Card,Angry Student Pyuriel Card,6,20,,10,,,,,,,,2,,,,,{ bonus bCritAtkRate,30; bonus2 bSubRace,RC_All,-10; bonus2 bSubRace,RC_Player,10; },{},{} +4579,Lola_Card,Warrior Lola Card,6,20,,10,,,,,,,,2,,,,,{ if(getiteminfo(getequipid(EQI_HAND_R),11) == W_MACE) { bonus bBaseAtk,20; bonus bCritical,10; } .@r = getrefine(); bonus bBaseAtk,.@r; bonus bCritical,.@r; },{},{} +4580,Kades_Card,Dark Guardian Kades Card,6,20,,10,,,,,,,,4,,,,,{ bonus2 bSubEle,Ele_Water,50; bonus2 bSubEle,Ele_Earth,50; bonus2 bSubEle,Ele_Fire,50; bonus2 bSubEle,Ele_Wind,50; bonus2 bSubEle,Ele_Dark,50; bonus2 bSubEle,Ele_Undead,50; bonus2 bSubEle,Ele_Holy,-100; bonus2 bSubEle,Ele_Ghost,-100; },{},{} 4581,Rudo_Card,Rudo Card,6,20,,10,,,,,,,,64,,,,,{ autobonus "{ sc_start SC_SPEEDUP1,3000,50; bonus bAgi,44; heal 0,-40; }",3,3000,0; },{},{} 4582,Bungisngis_Card,Bungisngis Card,6,20,,10,,,,,,,,769,,,,,{ bonus bMaxHPrate,(getrefine()/2); },{},{} 4583,Engkanto_Card,Engkanto Card,6,20,,10,,,,,,,,769,,,,,{ bonus2 bAddEle,Ele_Poison,30; bonus2 bMagicAddEle,Ele_Poison,30; bonus2 bIgnoreDefRaceRate,RC_Plant,30; },{},{} From b20ab4ace2380fc8f826740a98ef0e6e4f86957b Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Wed, 24 Aug 2016 15:17:35 +0200 Subject: [PATCH 06/16] SQL synchronization --- sql-files/item_db_re.sql | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index 8154d4e171..d4094426a2 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -2783,13 +2783,13 @@ REPLACE INTO `item_db_re` VALUES (4570,'Flamel_Card','Flamel Card',6,20,NULL,10, REPLACE INTO `item_db_re` VALUES (4571,'Gertie_Card','Gertie Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus bFlee,10; skill "RG_CLOSECONFINE",1;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4572,'Randel_Card','Randel Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus bFlee,10; skill "CR_AUTOGUARD",3;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4573,'Trentini_Card','Trentini Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus bFlee,10; if(BaseJob==Job_Dancer) { bonus bMaxHPrate,10; bonus bMaxSPrate,5;}',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4574,'General_Daehyon_Card','General Daehyon Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'.@i = getiteminfo(getequipid(EQI_HAND_R),11); if(.@i==W_1HSWORD||.@i==W_2HSWORD) { bonus bBaseAtk,100; }',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4575,'Armed_Guard_Soheon_Card','Armed Guard Soheon Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,10; if(getiteminfo(getequipid(EQI_HAND_R),11) == W_DAGGER) { .@r = getrefine(); if(.@r>=10) { bonus bAspd,1; } if(.@r>=14) { bonus bAspd,1; } }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4574,'Daehyon_Card','General Daehyon Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'.@i = getiteminfo(getequipid(EQI_HAND_R),11); if(.@i==W_1HSWORD||.@i==W_2HSWORD) { bonus bBaseAtk,100; }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4575,'Soheon_Card','Armed Guard Soheon Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,10; if(getiteminfo(getequipid(EQI_HAND_R),11) == W_DAGGER) { .@r = getrefine(); if(.@r>=10) { bonus bAspd,1; } if(.@r>=14) { bonus bAspd,1; } }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4576,'Gioia_Card','Gioia Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus2 bMagicAtkEle,Ele_Wind,100; bonus2 bMagicAtkEle,Ele_Ghost,100; bonus2 bSubEle,Ele_All,-30;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4577,'Elvira_Card','Elvira Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,136,NULL,NULL,NULL,NULL,'bonus2 bMagicAtkEle,Ele_Wind,20; bonus2 bMagicAtkEle,Ele_Ghost,20;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4578,'Angry_Student_Pyuriel_Card','Angry Student Pyuriel Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bCritAtkRate,30; bonus2 bSubRace,RC_All,-10; bonus2 bSubRace,RC_Player,10;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4579,'Warrior_Lola_Card','Warrior Lola Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'if(getiteminfo(getequipid(EQI_HAND_R),11) == W_MACE) { bonus bBaseAtk,20; bonus bCritical,10; } .@r = getrefine(); bonus bBaseAtk,.@r; bonus bCritical,.@r;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4580,'Dark_Guardian_Kades_Card','Dark Guardian Kades Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus2 bSubEle,Ele_Water,50; bonus2 bSubEle,Ele_Earth,50; bonus2 bSubEle,Ele_Fire,50; bonus2 bSubEle,Ele_Wind,50; bonus2 bSubEle,Ele_Dark,50; bonus2 bSubEle,Ele_Undead,50; bonus2 bSubEle,Ele_Holy,-100; bonus2 bSubEle,Ele_Ghost,-100;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4578,'Pyuriel_Card','Angry Student Pyuriel Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bCritAtkRate,30; bonus2 bSubRace,RC_All,-10; bonus2 bSubRace,RC_Player,10;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4579,'Lola_Card','Warrior Lola Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'if(getiteminfo(getequipid(EQI_HAND_R),11) == W_MACE) { bonus bBaseAtk,20; bonus bCritical,10; } .@r = getrefine(); bonus bBaseAtk,.@r; bonus bCritical,.@r;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4580,'Kades_Card','Dark Guardian Kades Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus2 bSubEle,Ele_Water,50; bonus2 bSubEle,Ele_Earth,50; bonus2 bSubEle,Ele_Fire,50; bonus2 bSubEle,Ele_Wind,50; bonus2 bSubEle,Ele_Dark,50; bonus2 bSubEle,Ele_Undead,50; bonus2 bSubEle,Ele_Holy,-100; bonus2 bSubEle,Ele_Ghost,-100;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4581,'Rudo_Card','Rudo Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,64,NULL,NULL,NULL,NULL,'autobonus "{ sc_start SC_SPEEDUP1,3000,50; bonus bAgi,44; heal 0,-40; }",3,3000,0;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4582,'Bungisngis_Card','Bungisngis Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus bMaxHPrate,(getrefine()/2);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4583,'Engkanto_Card','Engkanto Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus2 bAddEle,Ele_Poison,30; bonus2 bMagicAddEle,Ele_Poison,30; bonus2 bIgnoreDefRaceRate,RC_Plant,30;',NULL,NULL); From 1d6f99adab10c204f64d4708994e6e57d816fe1e Mon Sep 17 00:00:00 2001 From: Jittapan Pluemsumran Date: Wed, 24 Aug 2016 20:28:34 +0700 Subject: [PATCH 07/16] Follow up to 6bcfc18 --- db/re/item_db.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/db/re/item_db.txt b/db/re/item_db.txt index 3d4118f471..cbb1d0e215 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -2773,18 +2773,18 @@ 4593,Menblatt_Card,Menblatt Card,6,20,,10,,,,,,,,4,,,,,{ bonus bLongAtkRate,readparam(bDex)/10; },{},{} 4594,Petal_Card,Petal Card,6,20,,10,,,,,,,,4,,,,,{ bonus bCritAtkRate,2*(readparam(bLuk)/10); },{},{} 4595,Cenere_Card,Cenere Card,6,20,,10,,,,,,,,4,,,,,{ bonus bAspdRate,2*(readparam(bAgi)/10); },{},{} -4596,Antique_Book_Card,Antique Book Card,6,20,,10,,,,,,,,4,,,,,{ bonus bMatk,5*(readparam(bInt)/10); },{},{} -4597,Lichtern_Blue_Card,Lichtern Blue Card,6,20,,10,,,,,,,,769,,,,,{ bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Water,(getrefine()>=9)?10:5; },{},{} -4598,Lichtern_Green_Card,Lichtern Green Card,6,20,,10,,,,,,,,769,,,,,{ bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Ghost,(getrefine()>=9)?10:5; },{},{} -4599,Lichtern_Red_Card,Lichtern Red Card,6,20,,10,,,,,,,,769,,,,,{ bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Fire,(getrefine()>=9)?10:5; },{},{} -4600,Lichtern_Yellow_Card,Lichtern Yellow Card,6,20,,10,,,,,,,,769,,,,,{ bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Earth,(getrefine()>=9)?10:5; },{},{} +4596,AntiqueBook_Card,Antique Book Card,6,20,,10,,,,,,,,4,,,,,{ bonus bMatk,5*(readparam(bInt)/10); },{},{} +4597,LichternB_Card,Lichtern Blue Card,6,20,,10,,,,,,,,769,,,,,{ bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Water,(getrefine()>=9)?10:5; },{},{} +4598,LichternG_Card,Lichtern Green Card,6,20,,10,,,,,,,,769,,,,,{ bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Ghost,(getrefine()>=9)?10:5; },{},{} +4599,LichternR_Card,Lichtern Red Card,6,20,,10,,,,,,,,769,,,,,{ bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Fire,(getrefine()>=9)?10:5; },{},{} +4600,LichternY_Card,Lichtern Yellow Card,6,20,,10,,,,,,,,769,,,,,{ bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Earth,(getrefine()>=9)?10:5; },{},{} 4601,Amdarais_Card,Amdarais Card,6,20,,10,,,,,,,,16,,,,,{ bonus bAtkRate,15; bonus bMatkRate,15; bonus2 bHPLossRate,666,4000; bonus2 bSPLossRate,66,4000; },{},{ heal -6666,-666; } 4602,Realized_Amdarais_Card,Realized Amdarais Card,6,20,,10,,,,,,,,16,,,,,{ bonus bAtkRate,20; bonus bMatkRate,20; bonus2 bHPLossRate,666,6000; bonus2 bSPLossRate,66,6000; },{},{ heal -6666,-666; } 4603,Corruption_Root_Card,Corruption Root Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,20; bonus5 bAutoSpell,"NPC_WIDESTONE",1,70,BF_WEAPON,0; bonus5 bAutoSpell,"NPC_WIDESLEEP",1,70,BF_WEAPON,0; bonus5 bAutoSpell,"NPC_WIDECURSE",1,70,BF_WEAPON,0; },{},{} 4604,Realized_Corruption_Root_Card,Realized Corruption Root Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,30; bonus5 bAutoSpell,"NPC_WIDESTONE",2,70,BF_WEAPON,0; bonus5 bAutoSpell,"NPC_WIDESLEEP",2,70,BF_WEAPON,0; bonus5 bAutoSpell,"NPC_WIDECURSE",2,70,BF_WEAPON,0; },{},{} -4605,Agony_Of_Royal_Knight_Card,Agony Of Royal Knight Card,6,20,,10,,,,,,,,16,,,,,{ bonus bMaxHPrate,-44; bonus bHPGainValue,200+10*getrefine(); },{},{} -4606,Grudge_of_Royal_Knight_Card,Grudge of Royal Knight Card,6,20,,10,,,,,,,,4,,,,,{ bonus bMaxSPrate,-44; bonus bSPGainValue,20+(getrefine()/2); },{},{ heal 0,-444; } -4607,Faithful_Manager_Card,Faithful Manager Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus bMatk,5; if(getiteminfo(getequipid(EQI_HAND_R),11) == W_BOOK) { .@r = getrefine(); if(.@r>=10) { bonus bBaseAtk,20; bonus bMatk,20; } if(.@r>=14) { bonus bBaseAtk,20; bonus bMatk,20; } } },{},{} +4605,UndeadKnightM_Card,Agony Of Royal Knight Card,6,20,,10,,,,,,,,16,,,,,{ bonus bMaxHPrate,-44; bonus bHPGainValue,200+10*getrefine(); },{},{} +4606,UndeadKnightF_Card,Grudge of Royal Knight Card,6,20,,10,,,,,,,,4,,,,,{ bonus bMaxSPrate,-44; bonus bSPGainValue,20+(getrefine()/2); },{},{ heal 0,-444; } +4607,FaithfulManager_Card,Faithful Manager Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,5; bonus bMatk,5; if(getiteminfo(getequipid(EQI_HAND_R),11) == W_BOOK) { .@r = getrefine(); if(.@r>=10) { bonus bBaseAtk,20; bonus bMatk,20; } if(.@r>=14) { bonus bBaseAtk,20; bonus bMatk,20; } } },{},{} 4608,White_Knight_Card,White Knight Card,6,20,,10,,,,,,,,2,,,,,{ bonus bBaseAtk,15; bonus2 bAddSize,Size_Medium,20; bonus2 bAddSize,Size_Large,20; },{},{} 4609,Khalitzburg_Knight_Card,Khalitzburg Knight Card,6,20,,10,,,,,,,,32,,,,,{ bonus bDef,20; bonus2 bSubSize,Size_Medium,25; bonus2 bSubSize,Size_Large,25; },{},{} 4610,Sarah_Card,Sarah Card,6,10,,10,,,,,,,,16,,,,,{ bonus bAbsorbDmgMaxHP,100; },{},{} From f8a8c9fe798c315a3a340eb5a484d275c5c543b2 Mon Sep 17 00:00:00 2001 From: rAthenaAPI Date: Wed, 24 Aug 2016 15:29:36 +0200 Subject: [PATCH 08/16] SQL synchronization --- sql-files/item_db_re.sql | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sql-files/item_db_re.sql b/sql-files/item_db_re.sql index d4094426a2..6daa319ae1 100644 --- a/sql-files/item_db_re.sql +++ b/sql-files/item_db_re.sql @@ -2805,18 +2805,18 @@ REPLACE INTO `item_db_re` VALUES (4592,'Buwaya_Card','Buwaya Card',6,20,NULL,10, REPLACE INTO `item_db_re` VALUES (4593,'Menblatt_Card','Menblatt Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus bLongAtkRate,readparam(bDex)/10;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4594,'Petal_Card','Petal Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus bCritAtkRate,2*(readparam(bLuk)/10);',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4595,'Cenere_Card','Cenere Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus bAspdRate,2*(readparam(bAgi)/10);',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4596,'Antique_Book_Card','Antique Book Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus bMatk,5*(readparam(bInt)/10);',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4597,'Lichtern_Blue_Card','Lichtern Blue Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Water,(getrefine()>=9)?10:5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4598,'Lichtern_Green_Card','Lichtern Green Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Ghost,(getrefine()>=9)?10:5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4599,'Lichtern_Red_Card','Lichtern Red Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Fire,(getrefine()>=9)?10:5;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4600,'Lichtern_Yellow_Card','Lichtern Yellow Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Earth,(getrefine()>=9)?10:5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4596,'AntiqueBook_Card','Antique Book Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus bMatk,5*(readparam(bInt)/10);',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4597,'LichternB_Card','Lichtern Blue Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Water,(getrefine()>=9)?10:5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4598,'LichternG_Card','Lichtern Green Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Ghost,(getrefine()>=9)?10:5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4599,'LichternR_Card','Lichtern Red Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Fire,(getrefine()>=9)?10:5;',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4600,'LichternY_Card','Lichtern Yellow Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,769,NULL,NULL,NULL,NULL,'bonus bMatk,10; bonus2 bMagicAtkEle,Ele_Earth,(getrefine()>=9)?10:5;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4601,'Amdarais_Card','Amdarais Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bAtkRate,15; bonus bMatkRate,15; bonus2 bHPLossRate,666,4000; bonus2 bSPLossRate,66,4000;',NULL,'heal -6666,-666;'); REPLACE INTO `item_db_re` VALUES (4602,'Realized_Amdarais_Card','Realized Amdarais Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bAtkRate,20; bonus bMatkRate,20; bonus2 bHPLossRate,666,6000; bonus2 bSPLossRate,66,6000;',NULL,'heal -6666,-666;'); REPLACE INTO `item_db_re` VALUES (4603,'Corruption_Root_Card','Corruption Root Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,20; bonus5 bAutoSpell,"NPC_WIDESTONE",1,70,BF_WEAPON,0; bonus5 bAutoSpell,"NPC_WIDESLEEP",1,70,BF_WEAPON,0; bonus5 bAutoSpell,"NPC_WIDECURSE",1,70,BF_WEAPON,0;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4604,'Realized_Corruption_Root_Card','Realized Corruption Root Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,30; bonus5 bAutoSpell,"NPC_WIDESTONE",2,70,BF_WEAPON,0; bonus5 bAutoSpell,"NPC_WIDESLEEP",2,70,BF_WEAPON,0; bonus5 bAutoSpell,"NPC_WIDECURSE",2,70,BF_WEAPON,0;',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4605,'Agony_Of_Royal_Knight_Card','Agony Of Royal Knight Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bMaxHPrate,-44; bonus bHPGainValue,200+10*getrefine();',NULL,NULL); -REPLACE INTO `item_db_re` VALUES (4606,'Grudge_of_Royal_Knight_Card','Grudge of Royal Knight Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus bMaxSPrate,-44; bonus bSPGainValue,20+(getrefine()/2);',NULL,'heal 0,-444;'); -REPLACE INTO `item_db_re` VALUES (4607,'Faithful_Manager_Card','Faithful Manager Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,5; bonus bMatk,5; if(getiteminfo(getequipid(EQI_HAND_R),11) == W_BOOK) { .@r = getrefine(); if(.@r>=10) { bonus bBaseAtk,20; bonus bMatk,20; } if(.@r>=14) { bonus bBaseAtk,20; bonus bMatk,20; } }',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4605,'UndeadKnightM_Card','Agony Of Royal Knight Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bMaxHPrate,-44; bonus bHPGainValue,200+10*getrefine();',NULL,NULL); +REPLACE INTO `item_db_re` VALUES (4606,'UndeadKnightF_Card','Grudge of Royal Knight Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,NULL,NULL,NULL,'bonus bMaxSPrate,-44; bonus bSPGainValue,20+(getrefine()/2);',NULL,'heal 0,-444;'); +REPLACE INTO `item_db_re` VALUES (4607,'FaithfulManager_Card','Faithful Manager Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,5; bonus bMatk,5; if(getiteminfo(getequipid(EQI_HAND_R),11) == W_BOOK) { .@r = getrefine(); if(.@r>=10) { bonus bBaseAtk,20; bonus bMatk,20; } if(.@r>=14) { bonus bBaseAtk,20; bonus bMatk,20; } }',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4608,'White_Knight_Card','White Knight Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,NULL,NULL,'bonus bBaseAtk,15; bonus2 bAddSize,Size_Medium,20; bonus2 bAddSize,Size_Large,20;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4609,'Khalitzburg_Knight_Card','Khalitzburg Knight Card',6,20,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,32,NULL,NULL,NULL,NULL,'bonus bDef,20; bonus2 bSubSize,Size_Medium,25; bonus2 bSubSize,Size_Large,25;',NULL,NULL); REPLACE INTO `item_db_re` VALUES (4610,'Sarah_Card','Sarah Card',6,10,NULL,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL,16,NULL,NULL,NULL,NULL,'bonus bAbsorbDmgMaxHP,100;',NULL,NULL); From 5cae674b056aec4a36a1e04ec50e36dfde9e540e Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Thu, 25 Aug 2016 15:59:18 +0200 Subject: [PATCH 09/16] Used defined variable names for constant exports (#1417) --- src/map/script_constants.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/map/script_constants.h b/src/map/script_constants.h index bcc16de74c..48989fcf2b 100644 --- a/src/map/script_constants.h +++ b/src/map/script_constants.h @@ -457,9 +457,9 @@ script_set_constant("CharRename",SP_CHARRENAME,true); script_set_constant("Font",SP_CHARFONT,true); script_set_constant("BankVault",SP_BANK_VAULT,true); - script_set_constant("RouletteBronze",SP_ROULETTE_BRONZE,true); - script_set_constant("RouletteSilver",SP_ROULETTE_SILVER,true); - script_set_constant("RouletteGold",SP_ROULETTE_GOLD,true); + script_set_constant(ROULETTE_BRONZE_VAR,SP_ROULETTE_BRONZE,true); + script_set_constant(ROULETTE_SILVER_VAR,SP_ROULETTE_SILVER,true); + script_set_constant(ROULETTE_GOLD_VAR,SP_ROULETTE_GOLD,true); script_set_constant("bMaxHP",SP_MAXHP,false); script_set_constant("bMaxSP",SP_MAXSP,false); From c3b6951ba75242d55e207af66f88d5f7d0b4fa76 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Fri, 26 Aug 2016 10:01:49 +0200 Subject: [PATCH 10/16] Fixed default roulette data Thanks to @spinzaku for bringing it to my attention. --- sql-files/roulette_default_data.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql-files/roulette_default_data.sql b/sql-files/roulette_default_data.sql index 952f241777..770b2b4c98 100644 --- a/sql-files/roulette_default_data.sql +++ b/sql-files/roulette_default_data.sql @@ -8,7 +8,7 @@ INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 2, 1, 678, 1, 0 ); -- Poison_Bottle INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 3, 1, 604, 1, 0 ); -- Branch_Of_Dead_Tree INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 4, 1, 522, 1, 0 ); -- Fruit_Of_Mastela -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 5, 1, 671, 1, 0 ); -- Old_Ore_Box +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 5, 1, 12609, 1, 0 ); -- Old_Ore_Box INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 6, 1, 12523, 1, 0 ); -- E_Inc_Agi_10_Scroll INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 7, 1, 985, 1, 0 ); -- Elunium INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 8, 1, 984, 1, 0 ); -- Oridecon @@ -40,7 +40,7 @@ INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 30, 5, 671, 1, 1 ); -- Gold_Coin INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 31, 5, 12246, 1, 0 ); -- Magic_Card_Album INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 32, 5, 12263, 1, 0 ); -- Comp_Battle_Manual -INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 33, 5, 671, 1, 0 ); -- Potion_Box +INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 33, 5, 12831, 1, 0 ); -- Potion_Box INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 34, 5, 6235, 1, 0 ); -- Guarantee_Armor_6Up INSERT INTO `db_roulette`(`index`, `level`, `item_id`, `amount`, `flag` ) VALUES ( 35, 6, 671, 1, 1 ); -- Gold_Coin From 55edbc14ef8f3f6c06947a5257cc2ad65a0fe232 Mon Sep 17 00:00:00 2001 From: Atemo Date: Fri, 26 Aug 2016 19:26:53 +0200 Subject: [PATCH 11/16] Hazy Forest: - Added missing initnpctimer for npc 'Tired Rem's Garden Tree' and 'Spyder's Garden Tree' (issue #1517) --- npc/re/instances/HazyForest.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/npc/re/instances/HazyForest.txt b/npc/re/instances/HazyForest.txt index 6082ec1f9e..a2634bd100 100644 --- a/npc/re/instances/HazyForest.txt +++ b/npc/re/instances/HazyForest.txt @@ -208,6 +208,8 @@ function script F_Mora_Mist { mapannounce .@map$,getarg(1),bc_map,"0xccffcc"; //FW_NORMAL 12 0 0 enablenpc instance_npcname(getarg(0)); disablenpc instance_npcname(strnpcinfo(0)); + if (getarg(4,0)) + initnpctimer; close; } else mapannounce .@map$,((getarg(3,0))?getarg(2):getarg(2)+"'s Cry: Huh? Who's doing bad things to my tree?!"),bc_map,"0xccffcc"; //FW_NORMAL 12 0 0 @@ -261,7 +263,8 @@ OnMyMobDead: callfunc "F_Mora_Mist", "a4-2_a11", "Rem's Desperate Cry: Argh... Rem will sleep. Rem will sleep now, and won't wake up forever!", - "Rem"; + "Rem", + 0,1; end; OnInstanceInit: monster instance_mapname("1@mist"),101,107,"Rem the Gardener",2136,1,instance_npcname("Tired Rem's Garden Tree")+"::OnMyMobDead"; @@ -355,7 +358,8 @@ OnMyMobDead: callfunc "F_Mora_Mist", "b5_b14", "Depressed Whisper: Now it's all over with the second deepest forest. Gardeners are dying out-", - "Spyder"; + "Spyder", + 0,1; end; OnInstanceInit: monster instance_mapname("1@mist"),209,200,"Spyder the Eight-Legged",2132,1,instance_npcname("Spyder's Garden Tree")+"::OnMyMobDead"; From 08f63aa3b1bf9acdc98a90c03530501fb7252dac Mon Sep 17 00:00:00 2001 From: aleos89 Date: Fri, 26 Aug 2016 14:34:13 -0400 Subject: [PATCH 12/16] Corrected quest progression (fixes #1521) * Quests can now progress even if they are marked inactive. Thanks to @Tokeiburu! --- src/map/quest.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/map/quest.c b/src/map/quest.c index c43d090b62..d7ba16ce2f 100644 --- a/src/map/quest.c +++ b/src/map/quest.c @@ -244,7 +244,7 @@ void quest_update_objective(TBL_PC *sd, int mob_id) for( i = 0; i < sd->avail_quests; i++ ) { struct quest_db *qi = NULL; - if( sd->quest_log[i].state != Q_ACTIVE ) // Skip inactive quests + if( sd->quest_log[i].state == Q_COMPLETE ) // Skip complete quests continue; qi = quest_search(sd->quest_log[i].quest_id); @@ -356,6 +356,8 @@ int quest_check(TBL_PC *sd, int quest_id, enum quest_check_type type) switch( type ) { case HAVEQUEST: + if (sd->quest_log[i].state == Q_INACTIVE) // Player has the quest but it's in the inactive state; send it as Q_ACTIVE. + return 1; return sd->quest_log[i].state; case PLAYTIME: return (sd->quest_log[i].time < (unsigned int)time(NULL) ? 2 : sd->quest_log[i].state == Q_COMPLETE ? 1 : 0); From bf84469438ef780dfc49d90bb07e8feab984d53b Mon Sep 17 00:00:00 2001 From: aleos89 Date: Fri, 26 Aug 2016 14:41:22 -0400 Subject: [PATCH 13/16] Adjusted battle_getcurrentskill() return type * Adjusted the function's return type to uint16 to match the skill_id variable type. --- src/map/battle.c | 2 +- src/map/battle.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/battle.c b/src/map/battle.c index 38d4501f7b..d5c51918b7 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -36,7 +36,7 @@ static struct eri *delay_damage_ers; //For battle delay damage structures. * @param bl * @return skill_id */ -int battle_getcurrentskill(struct block_list *bl) +uint16 battle_getcurrentskill(struct block_list *bl) { struct unit_data *ud; diff --git a/src/map/battle.h b/src/map/battle.h index 318c2cb993..cea5afd1db 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -110,7 +110,7 @@ struct block_list* battle_get_master(struct block_list *src); struct block_list* battle_gettargeted(struct block_list *target); struct block_list* battle_getenemy(struct block_list *target, int type, int range); int battle_gettarget(struct block_list *bl); -int battle_getcurrentskill(struct block_list *bl); +uint16 battle_getcurrentskill(struct block_list *bl); int battle_check_undead(int race,int element); int battle_check_target(struct block_list *src, struct block_list *target,int flag); From cd5dbe28e45c36e7a40f02db83644d4bbd16cad4 Mon Sep 17 00:00:00 2001 From: aleos89 Date: Mon, 29 Aug 2016 11:56:19 -0400 Subject: [PATCH 14/16] Adjusted the npctalk script command * Now has an optional parameter of NPC name. - If supplied, it will display over that NPC's head, else it will use the attached NPC. --- doc/script_commands.txt | 4 +++- src/map/script.c | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 6d3d68eb51..1634026ed7 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -5984,11 +5984,13 @@ It is an approximation of official server script language's 'cmdothernpc'. --------------------------------------- -*npctalk ""; +*npctalk ""{,""}; This command will display a message to the surrounding area as if the NPC object running it was a player talking - that is, above their head and in the chat window. The display name of the NPC won't get appended in front of the message. +If the option is given, then that NPC will display the message, else +the attached NPC will display the message. // This will make everyone in the area see the NPC greet the character // who just invoked it. diff --git a/src/map/script.c b/src/map/script.c index 6f1e0d0e31..99056495e4 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -14280,10 +14280,14 @@ BUILDIN_FUNC(message) *------------------------------------------*/ BUILDIN_FUNC(npctalk) { - struct npc_data* nd = (struct npc_data *)map_id2bl(st->oid); + struct npc_data* nd = NULL; const char* str = script_getstr(st,2); - if (nd) { + if (script_hasdata(st, 3)) + nd = npc_name2id(script_getstr(st, 3)); + else + nd = (struct npc_data *)map_id2bl(st->oid); + if (nd != NULL) { char message[256]; safesnprintf(message, sizeof(message), "%s", str); clif_disp_overhead(&nd->bl, message); From b3b2bab7c5680710b4319faa69fc6470e0e5749a Mon Sep 17 00:00:00 2001 From: aleos89 Date: Mon, 29 Aug 2016 12:24:02 -0400 Subject: [PATCH 15/16] Follow up to cd5dbe2 * Forgot to adjust npctalk's definition. --- src/map/script.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/map/script.c b/src/map/script.c index 99056495e4..c0bf42735c 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -21985,7 +21985,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF2(atcommand,"charcommand","s"), // [MouseJstr] BUILDIN_DEF(movenpc,"sii?"), // [MouseJstr] BUILDIN_DEF(message,"ss"), // [MouseJstr] - BUILDIN_DEF(npctalk,"s"), // [Valaris] + BUILDIN_DEF(npctalk,"s?"), // [Valaris] BUILDIN_DEF(mobcount,"ss"), BUILDIN_DEF(getlook,"i?"), BUILDIN_DEF(getsavepoint,"i?"), From d84d6ba1e50852844303cfb11470de63cfd92a27 Mon Sep 17 00:00:00 2001 From: Cydh Ramdh Date: Tue, 30 Aug 2016 22:09:02 +0700 Subject: [PATCH 16/16] Initial release: Map X Job restriction (#1526) * Listed job with matched map zone is restricted to enter the map. * Added db file `job_noenter_map.txt` with format: `JobID,FlagZone,GroupLevelBypass`. * Reserved usage for WOE:TE implementation. * Typo correction, thanks @aleos89 @Lemongrass3110 --- db/import-tmpl/job_noenter_map.txt | 27 +++++++++++++ db/pre-re/job_noenter_map.txt | 27 +++++++++++++ db/re/job_noenter_map.txt | 27 +++++++++++++ doc/script_commands.txt | 11 +++++ src/common/mmo.h | 2 +- src/map/atcommand.c | 2 +- src/map/pc.c | 62 +++++++++++++++++++++++++++- src/map/pc.h | 6 +++ src/map/script.c | 65 ++++++++++++++++++++++++++---- src/map/skill.c | 9 +++-- vcproj-10/map-server.vcxproj | 1 + vcproj-12/map-server.vcxproj | 1 + vcproj-13/map-server.vcxproj | 1 + vcproj-14/map-server.vcxproj | 1 + 14 files changed, 229 insertions(+), 13 deletions(-) create mode 100644 db/import-tmpl/job_noenter_map.txt create mode 100644 db/pre-re/job_noenter_map.txt create mode 100644 db/re/job_noenter_map.txt diff --git a/db/import-tmpl/job_noenter_map.txt b/db/import-tmpl/job_noenter_map.txt new file mode 100644 index 0000000000..c9a25607f7 --- /dev/null +++ b/db/import-tmpl/job_noenter_map.txt @@ -0,0 +1,27 @@ +// Defines Job(s) that are restricted to enter map (by flag/zones) +// +// Structure of Database: +// JobID,FlagZone,GroupLevelBypass +// +// JobID: See JOB_* constants or use job number +// +// Legend for 'Flag' field (bitmask): +// 1 - restricted in normal maps +// 2 - restricted in PVP +// 4 - restricted in GVG +// 8 - restricted in Battlegrounds +// Restricted zones - configured by 'restricted ' mapflag +// 32 - restricted in zone 1 +// 64 - restricted in zone 2 +// 128 - restricted in zone 3 +// 256 - restricted in zone 4 +// 512 - restricted in zone 5 +// 1024 - restricted in zone 6 +// 2048 - restricted in zone 7 +// 4096 - restricted in zone 8 +// +// GroupLevelBypass: Group Level (groups.conf) to ignore the restriction +// +// NOTES: +// - Restriction will be overwritten for multiple defines with the same Job ID +// - The flag is used by 'jobcanentermap' script. diff --git a/db/pre-re/job_noenter_map.txt b/db/pre-re/job_noenter_map.txt new file mode 100644 index 0000000000..c9a25607f7 --- /dev/null +++ b/db/pre-re/job_noenter_map.txt @@ -0,0 +1,27 @@ +// Defines Job(s) that are restricted to enter map (by flag/zones) +// +// Structure of Database: +// JobID,FlagZone,GroupLevelBypass +// +// JobID: See JOB_* constants or use job number +// +// Legend for 'Flag' field (bitmask): +// 1 - restricted in normal maps +// 2 - restricted in PVP +// 4 - restricted in GVG +// 8 - restricted in Battlegrounds +// Restricted zones - configured by 'restricted ' mapflag +// 32 - restricted in zone 1 +// 64 - restricted in zone 2 +// 128 - restricted in zone 3 +// 256 - restricted in zone 4 +// 512 - restricted in zone 5 +// 1024 - restricted in zone 6 +// 2048 - restricted in zone 7 +// 4096 - restricted in zone 8 +// +// GroupLevelBypass: Group Level (groups.conf) to ignore the restriction +// +// NOTES: +// - Restriction will be overwritten for multiple defines with the same Job ID +// - The flag is used by 'jobcanentermap' script. diff --git a/db/re/job_noenter_map.txt b/db/re/job_noenter_map.txt new file mode 100644 index 0000000000..c9a25607f7 --- /dev/null +++ b/db/re/job_noenter_map.txt @@ -0,0 +1,27 @@ +// Defines Job(s) that are restricted to enter map (by flag/zones) +// +// Structure of Database: +// JobID,FlagZone,GroupLevelBypass +// +// JobID: See JOB_* constants or use job number +// +// Legend for 'Flag' field (bitmask): +// 1 - restricted in normal maps +// 2 - restricted in PVP +// 4 - restricted in GVG +// 8 - restricted in Battlegrounds +// Restricted zones - configured by 'restricted ' mapflag +// 32 - restricted in zone 1 +// 64 - restricted in zone 2 +// 128 - restricted in zone 3 +// 256 - restricted in zone 4 +// 512 - restricted in zone 5 +// 1024 - restricted in zone 6 +// 2048 - restricted in zone 7 +// 4096 - restricted in zone 8 +// +// GroupLevelBypass: Group Level (groups.conf) to ignore the restriction +// +// NOTES: +// - Restriction will be overwritten for multiple defines with the same Job ID +// - The flag is used by 'jobcanentermap' script. diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 1634026ed7..07b9b688ad 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -4302,6 +4302,17 @@ raise the specified stat from (current value - ) to current value. --------------------------------------- +*jobcanentermap(""{,}); + +Return true if player (decided by job) can enter the map, false otherwise. + +For optional 'JobID', see constant of Job_*, or use player's Class, BaseJob, +and BaseClass. If no player is attached, this param must have a value. + +See also db/[pre-]re/job_noenter_map.txt + +--------------------------------------- + *get_revision() This command will return the SVN revision number that the server is currently diff --git a/src/common/mmo.h b/src/common/mmo.h index a9bf24c670..86c40dfced 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -402,7 +402,7 @@ struct mmo_charstatus { unsigned int base_exp,job_exp; int zeny; - short class_; + short class_; ///< Player's JobID unsigned int status_point,skill_point; int hp,max_hp,sp,max_sp; unsigned int option; diff --git a/src/map/atcommand.c b/src/map/atcommand.c index b0163c28aa..6a51ee5f94 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -475,7 +475,7 @@ ACMD_FUNC(mapmove) if (!map_search_freecell(NULL, m, &x, &y, 10, 10, 1)) x = y = 0; //Invalid cell, use random spot. } - if (map[m].flag.nowarpto && !pc_has_permission(sd, PC_PERM_WARP_ANYWHERE)) { + if ((map[m].flag.nowarpto && !pc_has_permission(sd, PC_PERM_WARP_ANYWHERE)) || !pc_job_can_entermap((enum e_job)sd->status.class_, m, sd->group_level)) { clif_displaymessage(fd, msg_txt(sd,247)); return -1; } diff --git a/src/map/pc.c b/src/map/pc.c index 09bb268ac6..2ee5c6462a 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -113,7 +113,7 @@ struct item_cd { * Converts a class to its array index for CLASS_COUNT defined arrays. * Note that it does not do a validity check for speed purposes, where parsing * player input make sure to use a pcdb_checkid first! -* @param class_ +* @param class_ Job ID see enum e_job * @return Class Index */ int pc_class2idx(int class_) { @@ -11117,6 +11117,31 @@ static bool pc_readdb_job_param(char* fields[], int columns, int current) return true; } +/** + * Read job_noenter_map.txt + **/ +static bool pc_readdb_job_noenter_map(char *str[], int columns, int current) { + int idx, class_ = -1; + + if (ISDIGIT(str[0][0])) { + class_ = atoi(str[0]); + } else { + if (!script_get_constant(str[0], &class_)) { + ShowError("pc_readdb_job_noenter_map: Invalid job %s specified.\n", str[0]); + return false; + } + } + + if (!pcdb_checkid(class_) || (idx = pc_class2idx(class_)) < 0) { + ShowError("pc_readdb_job_noenter_map: Invalid job %d specified.\n", str[0]); + return false; + } + + job_info[idx].noenter_map.zone = atoi(str[1]); + job_info[idx].noenter_map.group_lv = atoi(str[2]); + return true; +} + static int pc_read_statsdb(const char *basedir, int last_s, bool silent){ int i=1; char line[24000]; //FIXME this seem too big @@ -11220,6 +11245,7 @@ void pc_readdb(void) { sv_readdb(dbsubpath2, "job_basehpsp_db.txt", ',', 4, 4+500, CLASS_COUNT*2, &pc_readdb_job_basehpsp, i); //Make it support until lvl 500! #endif sv_readdb(dbsubpath2, "job_param_db.txt", ',', 2, PARAM_MAX+1, CLASS_COUNT, &pc_readdb_job_param, i); + sv_readdb(dbsubpath2, "job_noenter_map.txt", ',', 3, 3, CLASS_COUNT, &pc_readdb_job_noenter_map, i); aFree(dbsubpath1); aFree(dbsubpath2); } @@ -12177,6 +12203,40 @@ void pc_show_questinfo_reinit(struct map_session_data *sd) { #endif } +/** + * Check if a job is allowed to enter the map + * @param jobid Job ID see enum e_job or sd->status.class_ + * @param m ID -an index- for direct indexing map[] array + * @return 1 if job is allowed, 0 otherwise + **/ +bool pc_job_can_entermap(enum e_job jobid, int m, int group_lv) { + uint16 idx = 0; + + // Map is other map server. + // !FIXME: Currently, a map-server doesn't recognized map's attributes on other server, so we assume it's fine to warp. + if (m < 0) + return true; + + if (m >= MAX_MAP_PER_SERVER || !map[m].cell) + return false; + + if (!pcdb_checkid(jobid)) + return false; + + idx = pc_class2idx(jobid); + if (!job_info[idx].noenter_map.zone || group_lv > job_info[idx].noenter_map.group_lv) + return true; + + if ((!map_flag_vs(m) && job_info[idx].noenter_map.zone&1) || // Normal + (map[m].flag.pvp && job_info[idx].noenter_map.zone&2) || // PVP + (map_flag_gvg2(m) && job_info[idx].noenter_map.zone&4) || // GVG + (map[m].flag.battleground && job_info[idx].noenter_map.zone&8) || // Battleground + (map[m].flag.restricted && job_info[idx].noenter_map.zone&(8*map[m].zone)) // Zone restriction + ) + return false; + + return true; +} /*========================================== * pc Init/Terminate diff --git a/src/map/pc.h b/src/map/pc.h index c8d648a360..e5520c2b6b 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -796,6 +796,10 @@ struct { struct s_params { uint16 str, agi, vit, int_, dex, luk; } max_param; + struct s_job_noenter_map { + uint32 zone; + uint8 group_lv; + } noenter_map; } job_info[CLASS_COUNT]; #define EQP_WEAPON EQP_HAND_R @@ -1262,6 +1266,8 @@ void pc_validate_skill(struct map_session_data *sd); void pc_show_questinfo(struct map_session_data *sd); void pc_show_questinfo_reinit(struct map_session_data *sd); +bool pc_job_can_entermap(enum e_job jobid, int m, int group_lv); + #if defined(RENEWAL_DROP) || defined(RENEWAL_EXP) int pc_level_penalty_mod(int level_diff, uint32 mob_class, enum e_mode mode, int type); #endif diff --git a/src/map/script.c b/src/map/script.c index c0bf42735c..01ce302889 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -5633,7 +5633,7 @@ BUILDIN_FUNC(warpparty) TBL_PC *pl_sd; struct party_data* p; int type; - int mapindex; + int mapindex = 0, m = -1; int i; const char* str = script_getstr(st,2); @@ -5662,18 +5662,21 @@ BUILDIN_FUNC(warpparty) return SCRIPT_CMD_FAILURE; pl_sd = p->data[i].sd; mapindex = pl_sd->mapindex; + m = map_mapindex2mapid(mapindex); x = pl_sd->bl.x; y = pl_sd->bl.y; break; case 4: mapindex = mapindex_name2id(str); + if (!mapindex) {// Invalid map + return SCRIPT_CMD_FAILURE; + } + m = map_mapindex2mapid(mapindex); break; case 2: //"SavePoint" uses save point of the currently attached player if (( sd = script_rid2sd(st) ) == NULL ) return SCRIPT_CMD_SUCCESS; - default: - mapindex = 0; break; } @@ -5704,7 +5707,7 @@ BUILDIN_FUNC(warpparty) break; case 3: // Leader case 4: // m,x,y - if(!map[pl_sd->bl.m].flag.noreturn && !map[pl_sd->bl.m].flag.nowarp) + if(!map[pl_sd->bl.m].flag.noreturn && !map[pl_sd->bl.m].flag.nowarp && pc_job_can_entermap((enum e_job)pl_sd->status.class_, m, pl_sd->group_level)) pc_setpos(pl_sd,mapindex,x,y,CLR_TELEPORT); break; } @@ -5723,7 +5726,7 @@ BUILDIN_FUNC(warpguild) TBL_PC *pl_sd; struct guild* g; struct s_mapiterator* iter; - int type; + int type, mapindex = 0, m = -1; const char* str = script_getstr(st,2); int x = script_getnum(st,3); @@ -5744,6 +5747,15 @@ BUILDIN_FUNC(warpguild) return SCRIPT_CMD_SUCCESS; } + switch (type) { + case 3: + mapindex = mapindex_name2id(str); + if (!mapindex) + return SCRIPT_CMD_FAILURE; + m = map_mapindex2mapid(mapindex); + break; + } + iter = mapit_getallusers(); for( pl_sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); pl_sd = (TBL_PC*)mapit_next(iter) ) { @@ -5765,8 +5777,8 @@ BUILDIN_FUNC(warpguild) pc_setpos(pl_sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,CLR_TELEPORT); break; case 3: // m,x,y - if(!map[pl_sd->bl.m].flag.noreturn && !map[pl_sd->bl.m].flag.nowarp) - pc_setpos(pl_sd,mapindex_name2id(str),x,y,CLR_TELEPORT); + if(!map[pl_sd->bl.m].flag.noreturn && !map[pl_sd->bl.m].flag.nowarp && pc_job_can_entermap((enum e_job)pl_sd->status.class_, m, pl_sd->group_level)) + pc_setpos(pl_sd,mapindex,x,y,CLR_TELEPORT); break; } } @@ -21681,6 +21693,44 @@ BUILDIN_FUNC(needed_status_point) { script_pushint(st, pc_need_status_point(sd, type, val)); return SCRIPT_CMD_SUCCESS; } + +/** + * jobcanentermap(""{,}); + * Check if (player with) JobID can enter the map. + * @param mapname Map name + * @param JobID Player's JobID (optional) + **/ +BUILDIN_FUNC(jobcanentermap) { + const char *mapname = script_getstr(st, 2); + int mapidx = mapindex_name2id(mapname), m = -1; + int jobid = 0; + TBL_PC *sd = NULL; + + if (!mapidx) {// Invalid map + script_pushint(st, false); + return SCRIPT_CMD_FAILURE; + } + m = map_mapindex2mapid(mapidx); + if (m == -1) { // Map is on different map server + ShowError("buildin_jobcanentermap: Map '%s' is not found in this server.\n", mapname); + script_pushint(st, false); + return SCRIPT_CMD_FAILURE; + } + + if (script_hasdata(st, 3)) { + jobid = script_getnum(st, 3); + } else { + if (!(sd = script_rid2sd(st))) { + script_pushint(st, false); + return SCRIPT_CMD_FAILURE; + } + jobid = sd->status.class_; + } + + script_pushint(st, pc_job_can_entermap((enum e_job)jobid, m, sd ? sd->group_level : 0)); + return SCRIPT_CMD_SUCCESS; +} + #include "../custom/script.inc" // declarations that were supposed to be exported from npc_chat.c @@ -22264,6 +22314,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(getequiprandomoption, "iii?"), BUILDIN_DEF(setrandomoption,"iiiii?"), BUILDIN_DEF(needed_status_point,"ii?"), + BUILDIN_DEF(jobcanentermap,"s?"), #include "../custom/script_def.inc" diff --git a/src/map/skill.c b/src/map/skill.c index 0574073a37..5184f9c9ad 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -8603,6 +8603,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if ((dstsd = g->member[i].sd) != NULL && sd != dstsd && !dstsd->state.autotrade && !pc_isdead(dstsd)) { if (map[dstsd->bl.m].flag.nowarp && !map_flag_gvg2(dstsd->bl.m)) continue; + if (!pc_job_can_entermap((enum e_job)dstsd->status.class_, src->m, dstsd->group_level)) + continue; if(map_getcell(src->m,src->x+dx[j],src->y+dy[j],CELL_CHKNOREACH)) dx[j] = dy[j] = 0; if (!pc_setpos(dstsd, map_id2index(src->m), src->x+dx[j], src->y+dy[j], CLR_RESPAWN)) @@ -13141,7 +13143,8 @@ static int skill_unit_onplace(struct skill_unit *unit, struct block_list *bl, un sg->val1 = (count<<16)|working; - pc_setpos(sd,m,x,y,CLR_TELEPORT); + if (pc_job_can_entermap((enum e_job)sd->status.class_, map_mapindex2mapid(m), sd->group_level)) + pc_setpos(sd,m,x,y,CLR_TELEPORT); } } else if(bl->type == BL_MOB && battle_config.mob_warp&2) { int16 m = map_mapindex2mapid(sg->val3); @@ -18122,13 +18125,13 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap) if(group->val1) { sd = map_charid2sd(group->val1); group->val1 = 0; - if (sd && !map[sd->bl.m].flag.nowarp) + if (sd && !map[sd->bl.m].flag.nowarp && pc_job_can_entermap((enum e_job)sd->status.class_, unit->bl.m, sd->group_level)) pc_setpos(sd,map_id2index(unit->bl.m),unit->bl.x,unit->bl.y,CLR_TELEPORT); } if(group->val2) { sd = map_charid2sd(group->val2); group->val2 = 0; - if (sd && !map[sd->bl.m].flag.nowarp) + if (sd && !map[sd->bl.m].flag.nowarp && pc_job_can_entermap((enum e_job)sd->status.class_, unit->bl.m, sd->group_level)) pc_setpos(sd,map_id2index(unit->bl.m),unit->bl.x,unit->bl.y,CLR_TELEPORT); } skill_delunit(unit); diff --git a/vcproj-10/map-server.vcxproj b/vcproj-10/map-server.vcxproj index 21460d653b..641c198152 100644 --- a/vcproj-10/map-server.vcxproj +++ b/vcproj-10/map-server.vcxproj @@ -325,6 +325,7 @@ + diff --git a/vcproj-12/map-server.vcxproj b/vcproj-12/map-server.vcxproj index e6e8bd3e85..9860aeb46a 100644 --- a/vcproj-12/map-server.vcxproj +++ b/vcproj-12/map-server.vcxproj @@ -329,6 +329,7 @@ + diff --git a/vcproj-13/map-server.vcxproj b/vcproj-13/map-server.vcxproj index 781402cc52..55b9440719 100644 --- a/vcproj-13/map-server.vcxproj +++ b/vcproj-13/map-server.vcxproj @@ -329,6 +329,7 @@ + diff --git a/vcproj-14/map-server.vcxproj b/vcproj-14/map-server.vcxproj index 45546eff48..9fd854c7e0 100644 --- a/vcproj-14/map-server.vcxproj +++ b/vcproj-14/map-server.vcxproj @@ -327,6 +327,7 @@ +