Просмотр исходного кода

Added Ranger Camouflage official behavior
Updated Basilica to finally act more official - Related to bugreport:171
Small restructure of disabling skill checks - Fixes bugreport:7411 and bugreport:7577
Updated 3rd class weight limit bonuses to official (thanks Baalberith) - Fixes bugreport:7019
Some skill tree cleanup as ALL_INCCARRY and ALL_BUYING_STORE aren't necessary anymore
Fixed Hanbok and Reins of Mount issue in newer clients (aleos) - Fixes bugreport:12622
Some small fixes to the MVP Arena script (aleos) - Fixes bugreport:7592
Fixed standard channels being removed (lighta) - Fixes bugreport:7590
Fixed some compiler warnings (lighta) - Fixes bugreport:7589
Attempt to fix disappearing carts on reboot (lighta) - Concerning bugreport:7591

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@17292 54d463be-8e91-2dee-dedb-b68131a5f0ec

akinari1087 12 лет назад
Родитель
Сommit
01b8e76e23

+ 4 - 0
conf/battle/client.conf

@@ -105,6 +105,10 @@ xmas_ignorepalette: no
 // Set this to yes if your cloth palettes pack doesn't has Summer palettes (or has less than the other jobs)
 summer_ignorepalette: no
 
+// Do not display cloth colors for the Hanbok class?
+// Set this to yes if your cloth palettes pack doesn't has Hanbok palettes (or has less than the other jobs)
+hanbok_ignorepalette: no
+
 // Set this to 1 if your clients have langtype problems and can't display motd properly
 motd_type: 0
 

+ 2 - 1
conf/msg_conf/char_msg.conf

@@ -112,7 +112,8 @@
 102: Expanded Super Baby
 103: Kagerou
 104: Oboro
-105: Unknown Job
+105: Hanbok
+106: Unknown Job
 
 //Auction
 200: Auction Manager

+ 3 - 0
db/const.txt

@@ -304,6 +304,7 @@ Option_Summer	0x40000
 Option_Wug	0x100000
 Option_Wugrider	0x200000
 Option_Hanbok	0x8000000
+Option_Mounting	0x10000000
 
 bc_all	0
 bc_map	1
@@ -1288,6 +1289,8 @@ SC_MAGMA_FLOW	548
 SC_PYROCLASTIC	549
 SC_PARALYSIS	550
 SC_PAIN_KILLER	551
+SC_EXTREMITYFIST2	552
+SC_HANBOK	553
 
 e_gasp	0
 e_what	1

Разница между файлами не показана из-за своего большого размера
+ 0 - 136
db/pre-re/skill_tree.txt


+ 34 - 34
db/re/job_db1.txt

@@ -160,73 +160,73 @@
 // Dark Collector
 4052,	24000,75   ,500  ,700  ,450  ,525  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,625  ,2000 ,2000 ,2000 ,2000 ,550  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 625, 0
 // Rune Knight (Regular)
-4054,	28000,150  ,500  ,300  ,440  ,540  ,560  ,590  ,620  ,560  ,620  ,640  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
+4054,	35000,150  ,500  ,300  ,440  ,540  ,560  ,590  ,620  ,560  ,620  ,640  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
 // Warlock (Regular)
-4055,	24000,55   ,500  ,900  ,490  ,560  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,540
+4055,	30000,55   ,500  ,900  ,490  ,560  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,540
 // Ranger (Regular)
-4056,	27000,85   ,500  ,400  ,440  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
+4056,	32000,85   ,500  ,400  ,440  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
 // Arch Bishop (Regular)
-4057,	26000,75   ,500  ,800  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,440  ,2000 ,640  ,2000 ,540  ,2000 ,2000 ,480  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590  ,540
+4057,	30000,75   ,500  ,800  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,440  ,2000 ,640  ,2000 ,540  ,2000 ,2000 ,480  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590  ,540
 // Mechanic (Regular)
-4058,	30000,90   ,500  ,400  ,440  ,640  ,690  ,2000 ,2000 ,2000 ,490  ,520  ,520  ,520  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
+4058,	38000,90   ,500  ,400  ,440  ,640  ,690  ,2000 ,2000 ,2000 ,490  ,520  ,520  ,520  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
 // Guillotine Cross (Regular)
-4059,	24000,110  ,500  ,400  ,440  ,460  ,690  ,2000 ,2000 ,2000 ,840  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,460  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
+4059,	32000,110  ,500  ,400  ,440  ,460  ,690  ,2000 ,2000 ,2000 ,840  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,460  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
 // Rune Knight (Trans)
-4060,	28000,150  ,500  ,300  ,440  ,540  ,560  ,590  ,620  ,560  ,620  ,640  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
+4060,	35000,150  ,500  ,300  ,440  ,540  ,560  ,590  ,620  ,560  ,620  ,640  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
 // Warlock (Trans)
-4061,	24000,55   ,500  ,900  ,490  ,560  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,540
+4061,	30000,55   ,500  ,900  ,490  ,560  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,540
 // Ranger (Trans)
-4062,	27000,85   ,500  ,400  ,440  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
+4062,	32000,85   ,500  ,400  ,440  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
 // Arch Bishop (Trans)
-4063,	26000,75   ,500  ,800  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,440  ,2000 ,640  ,2000 ,540  ,2000 ,2000 ,480  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590  ,540
+4063,	30000,75   ,500  ,800  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,440  ,2000 ,640  ,2000 ,540  ,2000 ,2000 ,480  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,590  ,540
 // Mechanic (Trans)
-4064,	30000,90   ,500  ,400  ,440  ,640  ,690  ,2000 ,2000 ,2000 ,490  ,520  ,520  ,520  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
+4064,	38000,90   ,500  ,400  ,440  ,640  ,690  ,2000 ,2000 ,2000 ,490  ,520  ,520  ,520  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
 // Guillotine Cross (Trans)
-4065,	24000,110  ,500  ,400  ,440  ,460  ,690  ,2000 ,2000 ,2000 ,840  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,460  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
+4065,	32000,110  ,500  ,400  ,440  ,460  ,690  ,2000 ,2000 ,2000 ,840  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,460  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530
 // Royal Guard (Regular)
-4066,	28000,110  ,700  ,470  ,440  ,510  ,490  ,530  ,540  ,540  ,520  ,560  ,480  ,480  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
+4066,	35000,110  ,700  ,470  ,440  ,510  ,490  ,530  ,540  ,540  ,520  ,560  ,480  ,480  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
 // Sorcerer (Regular)
-4067,	24000,75   ,500  ,700  ,440  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490  ,490
+4067,	30000,75   ,500  ,700  ,440  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490  ,490
 // Minstrel (Regular)
-4068,	27000,75   ,300  ,600  ,440  ,560  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510 
+4068,	32000,75   ,300  ,600  ,440  ,560  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510 
 // Wanderer (Regular)
-4069,	27000,75   ,300  ,600  ,440  ,560  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,2000 ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
+4069,	32000,75   ,300  ,600  ,440  ,560  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,2000 ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
 // Sura (Regular)
-4070,	26000,90   ,650  ,470  ,420  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470  ,470  ,520  ,2000 ,430  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,470
+4070,	30000,90   ,650  ,470  ,420  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470  ,470  ,520  ,2000 ,430  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,470
 // Genetic (Regular)
-4071,	30000,90   ,500  ,400  ,440  ,540  ,480  ,2000 ,2000 ,2000 ,550  ,550  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,480
+4071,	32000,90   ,500  ,400  ,440  ,540  ,480  ,2000 ,2000 ,2000 ,550  ,550  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,480
 // Shadow Chaser (Regular)
-4072,	24000,85   ,500  ,500  ,440  ,470  ,510  ,2000 ,2000 ,2000 ,2030 ,2000 ,2000 ,2000 ,2000 ,510  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
+4072,	28000,85   ,500  ,500  ,440  ,470  ,510  ,2000 ,2000 ,2000 ,2030 ,2000 ,2000 ,2000 ,2000 ,510  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
 // Royal Guard (Trans)
-4073,	28000,110  ,700  ,470  ,440  ,510  ,490  ,530  ,540  ,540  ,520  ,560  ,480  ,480  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
+4073,	35000,110  ,700  ,470  ,440  ,510  ,490  ,530  ,540  ,540  ,520  ,560  ,480  ,480  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
 // Sorcerer (Trans)
-4074,	24000,75   ,500  ,700  ,440  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490  ,490
+4074,	30000,75   ,500  ,700  ,440  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490  ,490
 // Minstrel (Trans)
-4075,	27000,75   ,300  ,600  ,440  ,560  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510 
+4075,	32000,75   ,300  ,600  ,440  ,560  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510 
 // Wanderer (Trans)
-4076,	27000,75   ,300  ,600  ,440  ,560  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,2000 ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
+4076,	32000,75   ,300  ,600  ,440  ,560  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,2000 ,2000 ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,510
 // Sura (Trans)
-4077,	26000,90   ,650  ,470  ,420  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470  ,470  ,520  ,2000 ,430  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,470
+4077,	30000,90   ,650  ,470  ,420  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,470  ,470  ,520  ,2000 ,430  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,540  ,470
 // Genetic (Trans)
-4078,	30000,90   ,500  ,400  ,440  ,540  ,480  ,2000 ,2000 ,2000 ,550  ,550  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,480
+4078,	32000,90   ,500  ,400  ,440  ,540  ,480  ,2000 ,2000 ,2000 ,550  ,550  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,480
 // Shadow Chaser (Trans)
-4079,	24000,85   ,500  ,500  ,440  ,470  ,510  ,2000 ,2000 ,2000 ,2030 ,2000 ,2000 ,2000 ,2000 ,510  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
+4079,	28000,85   ,500  ,500  ,440  ,470  ,510  ,2000 ,2000 ,2000 ,2030 ,2000 ,2000 ,2000 ,2000 ,510  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
 // Rune Knight (Dragon) (Regular)
-4080,	28000,150  ,500  ,300  ,440  ,540  ,560  ,590  ,620  ,560  ,620  ,640  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
+4080,	35000,150  ,500  ,300  ,440  ,540  ,560  ,590  ,620  ,560  ,620  ,640  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
 // Rune Knight (Dragon) (Trans)
-4081,	28000,150  ,500  ,300  ,440  ,540  ,560  ,590  ,620  ,560  ,620  ,640  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
+4081,	35000,150  ,500  ,300  ,440  ,540  ,560  ,590  ,620  ,560  ,620  ,640  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
 // Royal Guard (Gryphon) (Regular)
-4082,	28000,110  ,700  ,470  ,440  ,510  ,490  ,530  ,540  ,540  ,520  ,560  ,480  ,480  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
+4082,	35000,110  ,700  ,470  ,440  ,510  ,490  ,530  ,540  ,540  ,520  ,560  ,480  ,480  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
 // Royal Guard (Gryphon) (Trans)
-4083,	28000,110  ,700  ,470  ,440  ,510  ,490  ,530  ,540  ,540  ,520  ,560  ,480  ,480  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
+4083,	35000,110  ,700  ,470  ,440  ,510  ,490  ,530  ,540  ,540  ,520  ,560  ,480  ,480  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
 // Ranger (Warg) (Regular)
-4084,	27000,85   ,500  ,400  ,440  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
+4084,	32000,85   ,500  ,400  ,440  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
 // Ranger (Warg) (Trans)
-4085,	27000,85   ,500  ,400  ,440  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
+4085,	32000,85   ,500  ,400  ,440  ,540  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,530  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,520
 // Mechanic (Mado) (Regular)
-4086,	30000,90   ,500  ,400  ,440  ,640  ,690  ,2000 ,2000 ,2000 ,490  ,520  ,520  ,520  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
+4086,	38000,90   ,500  ,400  ,440  ,640  ,690  ,2000 ,2000 ,2000 ,490  ,520  ,520  ,520  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
 // Mechanic (Mado) (Trans)
-4087,	30000,90   ,500  ,400  ,440  ,640  ,690  ,2000 ,2000 ,2000 ,490  ,520  ,520  ,520  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
+4087,	38000,90   ,500  ,400  ,440  ,640  ,690  ,2000 ,2000 ,2000 ,490  ,520  ,520  ,520  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,500
 // Baby Rune Knight
 4096,	28000,150  ,500  ,300  ,440  ,540  ,560  ,590  ,620  ,560  ,620  ,640  ,490  ,490  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,490
 // Baby Warlock

Разница между файлами не показана из-за своего большого размера
+ 0 - 136
db/re/skill_tree.txt


+ 1 - 1
doc/atcommands.txt

@@ -833,7 +833,7 @@ Resets a Star Gladiator's marked maps.
 
 Changes your job.
 If no job is given, a list of all available jobs will be returned.
-Note that jobs 22 (Wedding), 26 (Summer), and 27 (Christmas) are not available via @job.
+Note that jobs 22 (Wedding), 26 (Summer), 27 (Christmas), and 28 (Hanbok) are not available via @job.
 
 ---------------------------------------
 

+ 3 - 3
npc/custom/etc/mvp_arena.txt

@@ -76,14 +76,14 @@ function	script	Protector	{
 	switch(select(""+((getarg(0)=="")?"":"Harder Monsters")+":Heal:Exit")) {
 	case 1:
 		warp getarg(0),102,102;
-		close;
+		end;
 	case 2:
 		specialeffect2 313;
 		percentheal 100,100;
-		close;
+		end;
 	case 3:
 		warp "prontera",156,179;
-		close;
+		end;
 	}
 }
 pvp_n_1-2,100,100,4	script	MVP-Protector#01	727,{ callfunc "Protector","pvp_n_2-2"; }

+ 4 - 1
src/char/inter.c

@@ -111,6 +111,9 @@ const char* job_name(int class_) {
 		case JOB_SUMMER:
 			return msg_txt(71);
 
+		case JOB_HANBOK:
+			return msg_txt(105);
+
 		case JOB_NOVICE_HIGH:
 		case JOB_SWORDMAN_HIGH:
 		case JOB_MAGE_HIGH:
@@ -277,7 +280,7 @@ const char* job_name(int class_) {
 			return msg_txt(103 - JOB_KAGEROU+class_);
 
 		default:
-			return msg_txt(105);
+			return msg_txt(106);
 	}
 }
 

+ 0 - 2
src/map/atcommand.c

@@ -5598,7 +5598,6 @@ ACMD_FUNC(changelook)
  * Turns on/off Autotrade for a specific player
  *------------------------------------------*/
 ACMD_FUNC(autotrade) {
-	int i;
 	nullpo_retr(-1, sd);
 
 	if( map[sd->bl.m].flag.autotrade != battle_config.autotrade_mapflag ) {
@@ -8763,7 +8762,6 @@ ACMD_FUNC(cart) {
 
 /* Channel System [Ind] */
 ACMD_FUNC(join){
-	struct Channel *channel;
 	char chname[CHAN_NAME_LENGTH], pass[CHAN_NAME_LENGTH];
 
 	if( !message || !*message || sscanf(message, "%s %s", chname, pass) < 1 ) {

+ 1 - 0
src/map/battle.c

@@ -5677,6 +5677,7 @@ static const struct _battle_data {
 	{ "wedding_ignorepalette",              &battle_config.wedding_ignorepalette,           0,      0,      1,              },
 	{ "xmas_ignorepalette",                 &battle_config.xmas_ignorepalette,              0,      0,      1,              },
 	{ "summer_ignorepalette",               &battle_config.summer_ignorepalette,            0,      0,      1,              },
+	{ "hanbok_ignorepalette",               &battle_config.hanbok_ignorepalette,            0,      0,      1,              },
 	{ "natural_healhp_interval",            &battle_config.natural_healhp_interval,         6000,   NATURAL_HEAL_INTERVAL, INT_MAX, },
 	{ "natural_healsp_interval",            &battle_config.natural_healsp_interval,         8000,   NATURAL_HEAL_INTERVAL, INT_MAX, },
 	{ "natural_heal_skill_interval",        &battle_config.natural_heal_skill_interval,     10000,  NATURAL_HEAL_INTERVAL, INT_MAX, },

+ 1 - 0
src/map/battle.h

@@ -220,6 +220,7 @@ extern struct Battle_Config
 	int wedding_ignorepalette;	//[Skotlex]
 	int xmas_ignorepalette;	// [Valaris]
 	int summer_ignorepalette; // [Zephyrus]
+	int hanbok_ignorepalette;
 	int natural_healhp_interval;
 	int natural_healsp_interval;
 	int natural_heal_skill_interval;

+ 1 - 2
src/map/channel.c

@@ -264,7 +264,7 @@ int channel_clean(struct Channel *channel, struct map_session_data *sd, int flag
 	}
 
 	idb_remove(channel->users,sd->status.char_id); //remove user for channel user list
-	if( !db_size(channel->users) && !(flag&1) )
+	if( !db_size(channel->users) && !(flag&1) && channel->type != CHAN_TYPE_PUBLIC )
 		channel_delete(channel);
 
 	return 0;
@@ -1145,7 +1145,6 @@ int do_init_channel(void) {
 void do_final_channel(void) {
 	DBIterator *iter;
 	struct Channel *channel;
-	struct guild *g;
 	int i=0;
 
 	//delete all in remaining chan db

+ 9 - 7
src/map/clif.c

@@ -844,7 +844,7 @@ void clif_clearunit_delayed(struct block_list* bl, clr_type type, unsigned int t
 
 void clif_get_weapon_view(struct map_session_data* sd, unsigned short *rhand, unsigned short *lhand)
 {
-	if(sd->sc.option&(OPTION_WEDDING|OPTION_XMAS|OPTION_SUMMER))
+	if(sd->sc.option&(OPTION_WEDDING|OPTION_XMAS|OPTION_SUMMER|OPTION_HANBOK))
 	{
 		*rhand = *lhand = 0;
 		return;
@@ -2984,12 +2984,13 @@ void clif_changelook(struct block_list *bl,int type,int val)
 		break;
 		case LOOK_BASE:
 			vd->class_ = val;
-			if (vd->class_ == JOB_WEDDING || vd->class_ == JOB_XMAS || vd->class_ == JOB_SUMMER)
+			if (vd->class_ == JOB_WEDDING || vd->class_ == JOB_XMAS || vd->class_ == JOB_SUMMER || vd->class_ == JOB_HANBOK)
 				vd->weapon = vd->shield = 0;
 			if (vd->cloth_color && (
 				(vd->class_ == JOB_WEDDING && battle_config.wedding_ignorepalette) ||
 				(vd->class_ == JOB_XMAS && battle_config.xmas_ignorepalette) ||
-				(vd->class_ == JOB_SUMMER && battle_config.summer_ignorepalette)
+				(vd->class_ == JOB_SUMMER && battle_config.summer_ignorepalette) ||
+				(vd->class_ == JOB_HANBOK && battle_config.hanbok_ignorepalette)
 			))
 				clif_changelook(bl,LOOK_CLOTHES_COLOR,0);
 		break;
@@ -3012,7 +3013,8 @@ void clif_changelook(struct block_list *bl,int type,int val)
 			if (val && (
 				(vd->class_ == JOB_WEDDING && battle_config.wedding_ignorepalette) ||
 				(vd->class_ == JOB_XMAS && battle_config.xmas_ignorepalette) ||
-				(vd->class_ == JOB_SUMMER && battle_config.summer_ignorepalette)
+				(vd->class_ == JOB_SUMMER && battle_config.summer_ignorepalette) ||
+				(vd->class_ == JOB_HANBOK && battle_config.hanbok_ignorepalette)
 			))
 				val = 0;
 			vd->cloth_color = val;
@@ -9806,7 +9808,7 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type,
 		if( pc_cant_act(sd) || sd->sc.option&OPTION_HIDE )
 			return;
 
-		if( sd->sc.option&(OPTION_WEDDING|OPTION_XMAS|OPTION_SUMMER) )
+		if( sd->sc.option&(OPTION_WEDDING|OPTION_XMAS|OPTION_SUMMER|OPTION_HANBOK) )
 			return;
 
 		if( sd->sc.data[SC_BASILICA] || sd->sc.data[SC__SHADOWFORM] )
@@ -10799,7 +10801,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
 		}
 	}
 
-	if( sd->sc.option&(OPTION_WEDDING|OPTION_XMAS|OPTION_SUMMER) )
+	if( sd->sc.option&(OPTION_WEDDING|OPTION_XMAS|OPTION_SUMMER|OPTION_HANBOK) )
 		return;
 
 	if( sd->sc.data[SC_BASILICA] && (skill_id != HP_BASILICA || sd->sc.data[SC_BASILICA]->val4 != sd->bl.id) )
@@ -10883,7 +10885,7 @@ static void clif_parse_UseSkillToPosSub(int fd, struct map_session_data *sd, uin
 		}
 	}
 
-	if( sd->sc.option&(OPTION_WEDDING|OPTION_XMAS|OPTION_SUMMER) )
+	if( sd->sc.option&(OPTION_WEDDING|OPTION_XMAS|OPTION_SUMMER|OPTION_HANBOK) )
 		return;
 
 	if( sd->sc.data[SC_BASILICA] && (skill_id != HP_BASILICA || sd->sc.data[SC_BASILICA]->val4 != sd->bl.id) )

+ 5 - 0
src/map/pc.c

@@ -7741,6 +7741,11 @@ int pc_setoption(struct map_session_data *sd,int type)
 	else if (!(type&OPTION_SUMMER) && p_type&OPTION_SUMMER)
 		new_look = -1;
 
+	if (type&OPTION_HANBOK && !(p_type&OPTION_HANBOK))
+		new_look = JOB_HANBOK;
+	else if (!(type&OPTION_HANBOK) && p_type&OPTION_HANBOK)
+		new_look = -1;
+
 	if (sd->disguise || !new_look)
 		return 0; //Disguises break sprite changes
 

+ 92 - 69
src/map/skill.c

@@ -5939,6 +5939,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 	case LG_FORCEOFVANGUARD:
 	case SC_REPRODUCE:
 	case SC_INVISIBILITY:
+	case RA_CAMOUFLAGE:
 		if (tsce) {
 			i = status_change_end(bl, type, INVALID_TIMER);
 			if( i )
@@ -5948,7 +5949,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 			map_freeblock_unlock();
 			return 0;
 		}
-	case RA_CAMOUFLAGE:
 		i = sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv));
 		if( i )
 			clif_skill_nodamage(src,bl,skill_id,( skill_id == LG_FORCEOFVANGUARD ) ? skill_lv : -1,i);
@@ -9989,13 +9989,13 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 		flag|=1;
 		break;
 	case HP_BASILICA:
-		if( sc->data[SC_BASILICA] )
-			status_change_end(src, SC_BASILICA, INVALID_TIMER); // Cancel Basilica
-		else { // Create Basilica. Start SC on caster. Unit timer start SC on others.
-			if( map_foreachinrange(skill_count_wos, src, 2, BL_MOB|BL_PC, src) ) {
-				if( sd )
-					clif_skill_fail(sd,skill_id,USESKILL_FAIL,0);
-				return 1;
+		if( sc->data[SC_BASILICA] ) {
+			status_change_end(src, SC_BASILICA, INVALID_TIMER); // Cancel Basilica and return so requirement isn't consumed again
+			return 0;
+		} else { // Create Basilica. Start SC on caster. Unit timer start SC on others.
+			if( map_getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) ) {
+				clif_skill_fail(sd,skill_id,USESKILL_FAIL,0);
+				return 0;
 			}
 			skill_clear_unitgroup(src);
 			if( skill_unitsetting(src,skill_id,skill_lv,x,y,0) )
@@ -11244,6 +11244,9 @@ static int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, un
 	if( skill_get_type(sg->skill_id) == BF_MAGIC && map_getcell(bl->m, bl->x, bl->y, CELL_CHKLANDPROTECTOR) && sg->skill_id != SA_LANDPROTECTOR )
 		return 0; //AoE skills are ineffective. [Skotlex]
 
+	if( skill_get_inf2(sg->skill_id)&(INF2_SONG_DANCE|INF2_ENSEMBLE_SKILL) && map_getcell(bl->m, bl->x, bl->y, CELL_CHKBASILICA) )
+		return 0; //Songs don't work in Basilica
+
 	sc = status_get_sc(bl);
 
 	if (sc && sc->option&OPTION_HIDE && sg->skill_id != WZ_HEAVENDRIVE && sg->skill_id != WL_EARTHSTRAIN )
@@ -12706,14 +12709,9 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 	if( sc && ( sc->data[SC__SHADOWFORM] || sc->data[SC__IGNORANCE] ) )
 		return 0;
 
-	switch( skill_id ) { // Turn off check.
-		case BS_MAXIMIZE:		case NV_TRICKDEAD:	case TF_HIDING:			case AS_CLOAKING:		case CR_AUTOGUARD:
-		case ML_AUTOGUARD:		case CR_DEFENDER:	case ML_DEFENDER:		case ST_CHASEWALK:		case PA_GOSPEL:
-		case CR_SHRINK:			case TK_RUN:		case GS_GATLINGFEVER:	case TK_READYCOUNTER:	case TK_READYDOWN:
-		case TK_READYSTORM:		case TK_READYTURN:	case SG_FUSION:			case RA_WUGDASH:		case KO_YAMIKUMO:
-			if( sc && sc->data[status_skill2sc(skill_id)] )
-				return 1;
-	}
+	//Checks if disabling skill - in which case no SP requirements are necessary
+	if( sc && skill_disable_check(sc,skill_id))
+		return 1;
 
 	// Check the skills that can be used while mounted on a warg
 	if( pc_isridingwug(sd) ) {
@@ -12762,7 +12760,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 		    return 0;
 		}
 	}
-	else if(inf2&INF2_ENSEMBLE_SKILL){
+	else if(inf2&INF2_ENSEMBLE_SKILL) {
 	    if (skill_check_pc_partner(sd, skill_id, &skill_lv, 1, 0) < 1) {
 		    clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 		    return 0;
@@ -12771,7 +12769,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 	// perform skill-specific checks (and actions)
 	switch( skill_id ) {
 		case SO_SPELLFIST:
-			if(sd->skill_id_old != MG_FIREBOLT && sd->skill_id_old != MG_COLDBOLT && sd->skill_id_old != MG_LIGHTNINGBOLT){
+			if(sd->skill_id_old != MG_FIREBOLT && sd->skill_id_old != MG_COLDBOLT && sd->skill_id_old != MG_LIGHTNINGBOLT) {
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				return 0;
 			}
@@ -12832,8 +12830,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 	//			return 0;
 			if( sc && (sc->data[SC_BLADESTOP] || sc->data[SC_CURSEDCIRCLE_ATKER]) )
 				break;
-			if( sc && sc->data[SC_COMBO] )
-			{
+			if( sc && sc->data[SC_COMBO] ) {
 				switch(sc->data[SC_COMBO]->val1) {
 					case MO_COMBOFINISH:
 					case CH_TIGERFIST:
@@ -12843,33 +12840,27 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 						return 0;
 				}
 			}
-			else if( !unit_can_move(&sd->bl) )
-			{	//Placed here as ST_MOVE_ENABLE should not apply if rooted or on a combo. [Skotlex]
+			else if( !unit_can_move(&sd->bl) ) { //Placed here as ST_MOVE_ENABLE should not apply if rooted or on a combo. [Skotlex]
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				return 0;
 			}
 			break;
-
 		case TK_MISSION:
-			if( (sd->class_&MAPID_UPPERMASK) != MAPID_TAEKWON )
-			{// Cannot be used by Non-Taekwon classes
+			if( (sd->class_&MAPID_UPPERMASK) != MAPID_TAEKWON ) { // Cannot be used by Non-Taekwon classes
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				return 0;
 			}
 			break;
-
 		case TK_READYCOUNTER:
 		case TK_READYDOWN:
 		case TK_READYSTORM:
 		case TK_READYTURN:
 		case TK_JUMPKICK:
-			if( (sd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER )
-			{// Soul Linkers cannot use this skill
+			if( (sd->class_&MAPID_UPPERMASK) == MAPID_SOUL_LINKER ) { // Soul Linkers cannot use this skill
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				return 0;
 			}
 			break;
-
 		case TK_TURNKICK:
 		case TK_STORMKICK:
 		case TK_DOWNKICK:
@@ -12894,8 +12885,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 		case BD_ADAPTATION:
 			{
 				int time;
-				if(!(sc && sc->data[SC_DANCING]))
-				{
+				if(!(sc && sc->data[SC_DANCING])) {
 					clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 					return 0;
 				}
@@ -12910,28 +12900,22 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 				}
 			}
 			break;
-
 		case PR_BENEDICTIO:
-			if (skill_check_pc_partner(sd, skill_id, &skill_lv, 1, 0) < 2)
-			{
+			if (skill_check_pc_partner(sd, skill_id, &skill_lv, 1, 0) < 2) {
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				return 0;
 			}
 			break;
-
 		case SL_SMA:
 			if(!(sc && sc->data[SC_SMA]))
 				return 0;
 			break;
-
 		case HT_POWER:
 			if(!(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == AC_DOUBLE))
 				return 0;
 			break;
-
 		case CG_HERMODE:
-			if(!npc_check_areanpc(1,sd->bl.m,sd->bl.x,sd->bl.y,skill_get_splash(skill_id, skill_lv)))
-			{
+			if(!npc_check_areanpc(1,sd->bl.m,sd->bl.x,sd->bl.y,skill_get_splash(skill_id, skill_lv))) {
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				return 0;
 			}
@@ -12960,10 +12944,29 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 				}
 				break;
 			}
+		case HP_BASILICA:
+			if( !sc || (sc && !sc->data[SC_BASILICA])) {
+				if( sd ) {
+					int i,x,y,range = skill_get_unit_range(skill_id,skill_lv)+1;
+					int size = range*2+1;
+					for( i=0;i<size*size;i++ ) {
+						x = sd->bl.x+(i%size-range);
+						y = sd->bl.y+(i/size-range);
+						if( map_getcell(sd->bl.m,x,y,CELL_CHKWALL) ) {
+							clif_skill_fail(sd,skill_id,USESKILL_FAIL,0);
+							return 0;
+						}
+					}
+					if( map_foreachinrange(skill_count_wos, &sd->bl, range, BL_ALL, &sd->bl) ) {
+						clif_skill_fail(sd,skill_id,USESKILL_FAIL,0);
+						return 0;
+					}
+				}
+			}
+			break;
 		case AM_TWILIGHT2:
 		case AM_TWILIGHT3:
-			if (!party_skill_check(sd, sd->status.party_id, skill_id, skill_lv))
-			{
+			if (!party_skill_check(sd, sd->status.party_id, skill_id, skill_lv)) {
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				return 0;
 			}
@@ -12995,8 +12998,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 				break;
 			//Auron insists we should implement SP consumption when you are not Soul Linked. [Skotlex]
 			//Only invoke on skill begin cast (instant cast skill). [Kevin]
-			if( require.sp > 0 )
-			{
+			if( require.sp > 0 ) {
 				if (status->sp < (unsigned int)require.sp)
 					clif_skill_fail(sd,skill_id,USESKILL_FAIL_SP_INSUFFICIENT,0);
 				else
@@ -13022,7 +13024,6 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 				return 0;
 			}
 			break;
-
 		case NJ_ISSEN:
 #ifdef RENEWAL
 			if (status->hp < (status->hp/100)) {
@@ -13038,7 +13039,6 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 				return 0;
 			}
 			break;
-
 		case NJ_ZENYNAGE:
 		case KO_MUCHANAGE:
 			if(sd->status.zeny < require.zeny) {
@@ -13057,8 +13057,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 			}
 			break;
 		case AM_REST: //Can't vapo homun if you don't have an active homunc or it's hp is < 80%
-			if (!merc_is_hom_active(sd->hd) || sd->hd->battle_status.hp < (sd->hd->battle_status.max_hp*80/100))
-			{
+			if (!merc_is_hom_active(sd->hd) || sd->hd->battle_status.hp < (sd->hd->battle_status.max_hp*80/100)) {
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				return 0;
 			}
@@ -13095,8 +13094,8 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 		 * Warlock
 		 **/
 		case WL_COMET:
-			if( skill_check_pc_partner(sd,skill_id,&skill_lv,1,0) <= 0 && ((i = pc_search_inventory(sd,require.itemid[0])) < 0 || sd->status.inventory[i].amount < require.amount[0]) )
-			{
+			if( skill_check_pc_partner(sd,skill_id,&skill_lv,1,0) <= 0 
+				&& ((i = pc_search_inventory(sd,require.itemid[0])) < 0 || sd->status.inventory[i].amount < require.amount[0]) ) {
 				//clif_skill_fail(sd,skill_id,USESKILL_FAIL_NEED_ITEM,require.amount[0],require.itemid[0]);
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				return 0;
@@ -13106,11 +13105,9 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 		case WL_SUMMONBL:
 		case WL_SUMMONWB:
 		case WL_SUMMONSTONE:
-			if( sc )
-			{
+			if( sc ) {
 				ARR_FIND(SC_SPHERE_1,SC_SPHERE_5+1,i,!sc->data[i]);
-				if( i == SC_SPHERE_5+1 )
-				{ // No more free slots
+				if( i == SC_SPHERE_5+1 ) { // No more free slots
 					clif_skill_fail(sd,skill_id,USESKILL_FAIL_SUMMON,0);
 					return 0;
 				}
@@ -13279,7 +13276,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 			{
 				int ttype = skill_get_ele(skill_id, skill_lv);
 				ARR_FIND(1, 5, i, sd->talisman[i] > 0 && i != ttype);
-				if( (i < 5 && i != ttype) || sd->talisman[ttype] >= 10 ){
+				if( (i < 5 && i != ttype) || sd->talisman[ttype] >= 10 ) {
 					clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
 					return 0;
 				}
@@ -13390,7 +13387,7 @@ int skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_id
 		}
 		break;
 	case ST_RIDINGWUG:
-		if( !pc_isridingwug(sd) ){
+		if( !pc_isridingwug(sd) ) {
 			clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 			return 0;
 		}
@@ -13709,15 +13706,9 @@ struct skill_condition skill_get_requirement(struct map_session_data* sd, uint16
 	if( !sc->count )
 		sc = NULL;
 
-	switch( skill_id )
-	{ // Turn off check.
-	case BS_MAXIMIZE:		case NV_TRICKDEAD:	case TF_HIDING:			case AS_CLOAKING:		case CR_AUTOGUARD:
-	case ML_AUTOGUARD:		case CR_DEFENDER:	case ML_DEFENDER:		case ST_CHASEWALK:		case PA_GOSPEL:
-	case CR_SHRINK:			case TK_RUN:		case GS_GATLINGFEVER:	case TK_READYCOUNTER:	case TK_READYDOWN:
-	case TK_READYSTORM:		case TK_READYTURN:	case SG_FUSION:			case KO_YAMIKUMO:
-		if( sc && sc->data[status_skill2sc(skill_id)] )
-			return req;
-	}
+	//Checks if disabling skill - in which case no SP requirements are necessary
+	if( sc && skill_disable_check(sc,skill_id) )
+		return req;
 
 	idx = skill_get_index(skill_id);
 	if( idx == 0 ) // invalid skill id
@@ -15197,13 +15188,10 @@ bool skill_check_camouflage(struct block_list *bl, struct status_change_entry *s
 
 	if( sce ) {
 		if( !wall ) {
-			if( sce->val1 < 3 ) //End camouflage.
+			if( sce->val1 == 1 ) //End camouflage.
 				status_change_end(bl, SC_CAMOUFLAGE, INVALID_TIMER);
-			else if( sce->val3&1 ) { //Remove wall bonus
-				sce->val3&=~1;
-				status_calc_bl(bl,SCB_SPEED);
-			}
 		}
+		status_calc_bl(bl,SCB_SPEED);
 	}
 
 	return wall;
@@ -17658,6 +17646,41 @@ int skill_block_check(struct block_list *bl, sc_type type , uint16 skill_id) {
 	return 0;
 }
 
+/* Determines whether a skill is currently active or not
+ * Used for purposes of cancelling SP usage when disabling a skill
+ */
+int skill_disable_check(struct status_change *sc, uint16 skill_id)
+{
+	switch( skill_id ){ // HP & SP Consumption Check
+		case BS_MAXIMIZE:
+		case NV_TRICKDEAD:
+		case TF_HIDING:
+		case AS_CLOAKING:
+		case GC_CLOAKINGEXCEED:
+		case ST_CHASEWALK:
+		case CR_DEFENDER:
+		case CR_SHRINK:
+		case CR_AUTOGUARD:
+		case ML_DEFENDER:
+		case ML_AUTOGUARD:
+		case PA_GOSPEL:
+		case GS_GATLINGFEVER:
+		case TK_READYCOUNTER:
+		case TK_READYDOWN:
+		case TK_READYSTORM:
+		case TK_READYTURN:
+		case TK_RUN:
+		case SG_FUSION:
+		case KO_YAMIKUMO:
+		case RA_WUGDASH:
+		case RA_CAMOUFLAGE:
+			if( sc->data[status_skill2sc(skill_id)] )
+				return 1;	
+	}
+
+	return 0;
+}
+
 int skill_get_elemental_type( uint16 skill_id , uint16 skill_lv ) {
 	int type = 0;
 

+ 1 - 0
src/map/skill.h

@@ -314,6 +314,7 @@ int skill_check_condition_castbegin(struct map_session_data *sd, uint16 skill_id
 int skill_check_condition_castend(struct map_session_data *sd, uint16 skill_id, uint16 skill_lv);
 int skill_consume_requirement(struct map_session_data *sd, uint16 skill_id, uint16 skill_lv, short type);
 struct skill_condition skill_get_requirement(struct map_session_data *sd, uint16 skill_id, uint16 skill_lv);
+int skill_disable_check(struct status_change *sc, uint16 skill_id);
 
 int skill_check_pc_partner(struct map_session_data *sd, uint16 skill_id, short* skill_lv, int range, int cast_flag);
 // -- moonsoul	(added skill_check_unit_cell)

+ 41 - 13
src/map/status.c

@@ -598,7 +598,7 @@ void initChangeTables(void) {
 	set_sc( RA_FEARBREEZE        , SC_FEARBREEZE      , SI_FEARBREEZE      , SCB_NONE );
 	set_sc( RA_ELECTRICSHOCKER   , SC_ELECTRICSHOCKER , SI_ELECTRICSHOCKER , SCB_NONE );
 	set_sc( RA_WUGDASH           , SC_WUGDASH         , SI_WUGDASH         , SCB_SPEED );
-	set_sc( RA_CAMOUFLAGE        , SC_CAMOUFLAGE      , SI_CAMOUFLAGE      , SCB_SPEED );
+	set_sc( RA_CAMOUFLAGE        , SC_CAMOUFLAGE      , SI_CAMOUFLAGE      , SCB_CRI|SCB_SPEED|SCB_WATK|SCB_DEF );
 	add_sc( RA_MAGENTATRAP       , SC_ELEMENTALCHANGE );
 	add_sc( RA_COBALTTRAP        , SC_ELEMENTALCHANGE );
 	add_sc( RA_MAIZETRAP         , SC_ELEMENTALCHANGE );
@@ -3574,8 +3574,7 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, enum sc
 				  || (sc->data[SC_BASILICA] && sc->data[SC_BASILICA]->val4 == bl->id) // Basilica caster cannot move
 				  || (sc->data[SC_GRAVITATION] && sc->data[SC_GRAVITATION]->val3 == BCT_SELF)
 				  || (sc->data[SC_CRYSTALIZE] && bl->type != BL_MOB)
-				  || (sc->data[SC_CAMOUFLAGE] && sc->data[SC_CAMOUFLAGE]->val1 < 3
-							&& !(sc->data[SC_CAMOUFLAGE]->val3&1))
+				  || (sc->data[SC_CAMOUFLAGE] && sc->data[SC_CAMOUFLAGE]->val1 < 3)
 				 ) {
 			sc->cant.move += ( start ? 1 : -1 );
 		}
@@ -5230,7 +5229,7 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha
 					val = max( val, 70 );
 				if( sc->data[SC_MARSHOFABYSS] )
 					val = max( val, 40 + 10 * sc->data[SC_MARSHOFABYSS]->val1 );
-				if( sc->data[SC_CAMOUFLAGE] && (sc->data[SC_CAMOUFLAGE]->val3&1) == 0 )
+				if( sc->data[SC_CAMOUFLAGE] )
 					val = max( val, sc->data[SC_CAMOUFLAGE]->val1 < 3 ? 0 : 25 * (5 - sc->data[SC_CAMOUFLAGE]->val1) );
 				if( sc->data[SC__GROOMY] )
 					val = max( val, sc->data[SC__GROOMY]->val2);
@@ -6104,6 +6103,8 @@ void status_set_viewdata(struct block_list *bl, int class_)
 					class_ = JOB_SUMMER;
 				else if (sd->sc.option&OPTION_XMAS)
 					class_ = JOB_XMAS;
+				else if (sd->sc.option&OPTION_HANBOK)
+					class_ = JOB_HANBOK;
 				else if (sd->sc.option&OPTION_RIDING) {
 					switch (class_) {	//Adapt class to a Mounted one.
 						case JOB_KNIGHT:
@@ -6209,6 +6210,7 @@ void status_set_viewdata(struct block_list *bl, int class_)
 		(vd->class_==JOB_WEDDING && battle_config.wedding_ignorepalette)
 		|| (vd->class_==JOB_XMAS && battle_config.xmas_ignorepalette)
 		|| (vd->class_==JOB_SUMMER && battle_config.summer_ignorepalette)
+		|| (vd->class_ == JOB_HANBOK && battle_config.hanbok_ignorepalette)
 	))
 		vd->cloth_color = 0;
 }
@@ -7544,6 +7546,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		case SC_WEDDING:
 		case SC_XMAS:
 		case SC_SUMMER:
+		case SC_HANBOK:
 			if (!vd) return 0;
 			//Store previous values as they could be removed.
 			val1 = vd->class_;
@@ -7553,7 +7556,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 			unit_stop_attack(bl);
 			clif_changelook(bl,LOOK_WEAPON,0);
 			clif_changelook(bl,LOOK_SHIELD,0);
-			clif_changelook(bl,LOOK_BASE,type==SC_WEDDING?JOB_WEDDING:type==SC_XMAS?JOB_XMAS:JOB_SUMMER);
+			clif_changelook(bl,LOOK_BASE,type==SC_WEDDING?JOB_WEDDING:type==SC_XMAS?JOB_XMAS:type==SC_SUMMER?JOB_SUMMER:JOB_HANBOK);
 			clif_changelook(bl,LOOK_CLOTHES_COLOR,vd->cloth_color);
 			break;
 		case SC_NOCHAT:
@@ -8796,9 +8799,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		case SC_WEDDING:
 		case SC_XMAS:
 		case SC_SUMMER:
+		case SC_HANBOK:
 			clif_changelook(bl,LOOK_WEAPON,0);
 			clif_changelook(bl,LOOK_SHIELD,0);
-			clif_changelook(bl,LOOK_BASE,type==SC_WEDDING?JOB_WEDDING:type==SC_XMAS?JOB_XMAS:JOB_SUMMER);
+			clif_changelook(bl,LOOK_BASE,type==SC_WEDDING?JOB_WEDDING:type==SC_XMAS?JOB_XMAS:type==SC_SUMMER?JOB_SUMMER:JOB_HANBOK);
 			clif_changelook(bl,LOOK_CLOTHES_COLOR,val4);
 			break;
 		case SC_KAAHI:
@@ -9008,6 +9012,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
 		case SC_SUMMER:
 			sc->option |= OPTION_SUMMER;
 			break;
+		case SC_HANBOK:
+			sc->option |= OPTION_HANBOK;
+			break;
 		case SC_ORCISH:
 			sc->option |= OPTION_ORCISH;
 			break;
@@ -9170,6 +9177,7 @@ int status_change_clear(struct block_list* bl, int type) {
 			case SC_MELTDOWN:
 			case SC_XMAS:
 			case SC_SUMMER:
+			case SC_HANBOK:
 			case SC_NOCHAT:
 			case SC_FUSION:
 			case SC_EARTHSCROLL:
@@ -9319,11 +9327,12 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
 		case SC_WEDDING:
 		case SC_XMAS:
 		case SC_SUMMER:
+		case SC_HANBOK:
 			if (!vd) break;
 			if (sd)
 			{	//Load data from sd->status.* as the stored values could have changed.
 				//Must remove OPTION to prevent class being rechanged.
-				sc->option &= type==SC_WEDDING?~OPTION_WEDDING:type==SC_XMAS?~OPTION_XMAS:~OPTION_SUMMER;
+				sc->option &= type==SC_WEDDING?~OPTION_WEDDING:type==SC_XMAS?~OPTION_XMAS:type==SC_SUMMER?~OPTION_SUMMER:~OPTION_HANBOK;
 				clif_changeoption(&sd->bl);
 				status_set_viewdata(bl, sd->status.class_);
 			} else {
@@ -9772,6 +9781,9 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
 	case SC_SUMMER:
 		sc->option &= ~OPTION_SUMMER;
 		break;
+	case SC_HANBOK:
+		sc->option &= ~OPTION_HANBOK;
+		break;
 	case SC_ORCISH:
 		sc->option &= ~OPTION_ORCISH;
 		break;
@@ -10480,12 +10492,27 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
 		break;
 
 	case SC_CAMOUFLAGE:
-		if(--(sce->val4) > 0){
-			status_charge(bl,0,7 - sce->val1);
-			sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
-			return 0;
-		}
-		break;
+		if (!status_charge(bl, 0, 7 - sce->val1))
+			break;
+		if (sd && --sce->val4 >= 0) {
+			if (!(sce->val2 & 1)) {
+				status->cri += sd->base_status.cri * 1 / 10; //+10% per second
+				if (status->cri > 1000) { //max 100%
+					status->cri = 1000;
+					sce->val2 |= 1;
+				}
+			}
+			if (!(sce->val2 & 2)) {
+				status->def2 -= sd->base_status.def2 * 1 / 20; //-5% per second
+				if (status->def2 < 0) { //min 0
+					status->def2 = 0;
+					sce->val2 |= 2;
+				}
+			}
+			status->rhw.atk += 30; //+30 per second
+ 		}
+		sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
+		return 0;
 
 	case SC__REPRODUCE:
 		if(!status_charge(bl, 0, 1))
@@ -10925,6 +10952,7 @@ int status_change_clear_buffs (struct block_list* bl, int type)
 			case SC_ABUNDANCE:
 			case SC_CURSEDCIRCLE_ATKER:
 			case SC_CURSEDCIRCLE_TARGET:
+			case SC_PUSH_CART:
 				continue;
 
 		 //Debuffs that can be removed.

+ 4 - 2
src/map/status.h

@@ -649,11 +649,12 @@ typedef enum sc_type {
 	SC_PARALYSIS,
 	SC_PAIN_KILLER,
 
-
 #ifdef RENEWAL
 	SC_EXTREMITYFIST2,
 #endif
 
+	SC_HANBOK,
+
 	SC_MAX, //Automatically updated max, used in for's to check we are within bounds.
 } sc_type;
 
@@ -1504,7 +1505,8 @@ enum {
 	OPTION_DRAGON3   = 0x01000000,
 	OPTION_DRAGON4   = 0x02000000,
 	OPTION_DRAGON5   = 0x04000000,
-	OPTION_MOUNTING  = 0x08000000,
+	OPTION_HANBOK    = 0x08000000,
+	OPTION_MOUNTING  = 0X10000000,
 
 #ifndef NEW_CARTS
 	OPTION_CART1     = 0x00000008,

Некоторые файлы не были показаны из-за большого количества измененных файлов