Forráskód Böngészése

* Bug Fixes:
- Added base level modifier for Great Echo. (bugreport:9179).
- Fixed Max HP/SP rate reduction, should be limited to -100% if the value less than it. (bugreport:9195).
- Fixed Knuckle Arrow (SR_KNUCKLEARROW, Sura) knockback damage bonus behavior. (bugreport:9096).
- Fixed Knuckle Arrow (SR_KNUCKLEARROW, Sura) knockback direction by saving last direction before attacker slides to target first.
- Fixed Overbrand (LG_OVERBRAND_BRANDISH, Royal Guard) knockback damage bonus behavior. (bugreport:9096).
- Fixed knockback direction for Arrow Shower (AC_SHOWER, Archer), now using target to attacker direction. (bugreport:1709).

* Misc:
- Added new flags for Skill Unit to remove hardcoded checks:
--- UF_NOKNOCKBACK: Cannot be knocked back (only unit that can be damaged).
--- UF_REM_CRAZYWEED: Removed if be overlapped by GN_CRAZYWEED.
--- UF_REM_FIRERAIN: Removed if be overlapped by RL_FIRE_RAIN.
- Implemented knockback damage bonus for Round Trip (RL_R_TRIP, Rebellion).

Signed-off-by: Cydh Ramdh <house.bad@gmail.com>

Cydh Ramdh 10 éve
szülő
commit
453b6d0023

+ 1 - 1
db/pre-re/skill_db.txt

@@ -1250,7 +1250,7 @@
 2569,9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0,	RL_AM_BLAST,Anti-Material Blast
 2570,9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0,	RL_SLUGSHOT,Slug Shot
 2571,7:8:9:10:11,6,2,-1,0x2,2,5,1,no,0,0,0,weapon,0,0x0,	RL_HAMMER_OF_GOD,Hammer of God
-//2572,0,6,1,-1,0x40,0,5,1,no,0,0,0,weapon,0,0,	RL_R_TRIP_PLUSATK,Round Trip Plus Attack
+2572,0,6,1,-1,0x40,0,5,1,no,0,0,0,weapon,0,0,	RL_R_TRIP_PLUSATK,Round Trip Plus Attack
 //2573,0,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0,	RL_B_FLICKER_ATK,Bind Flicker Attack
 //2574,0,6,1,-1,0,0,10,1,no,0,0,0,weapon,0,0,	RL_GLITTERING_GREED_ATK,Flip The Coin Greed Attack
 

+ 3 - 3
db/pre-re/skill_require_db.txt

@@ -886,7 +886,7 @@
 
 //****
 // Rebellion
-2551,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//RL_GLITTERING_GREED
+//2551,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0							//RL_GLITTERING_GREED
 2552,0,0,10,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//RL_RICHS_COIN
 2553,0,0,80:84:88:92:96,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0					//RL_MASS_SPIRAL
 2554,0,0,55:60:65:70:75,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0					//RL_BANISHING_BUSTER
@@ -908,8 +908,8 @@
 2570,0,0,55:60:65:70:75,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0					//RL_SLUGSHOT
 2571,0,0,70:80:90:100:110,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0				//RL_HAMMER_OF_GOD
 2572,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//RL_R_TRIP_PLUSATK
-2573,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//RL_B_FLICKER_ATK
-2574,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//RL_GLITTERING_GREED_ATK
+//2573,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0							//RL_B_FLICKER_ATK
+//2574,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0							//RL_GLITTERING_GREED_ATK
 
 //****
 // Kagerou/Oboro

+ 54 - 51
db/pre-re/skill_unit_db.txt

@@ -18,7 +18,10 @@
 //      0x0200(UF_ENSEMBLE)			Ensemble skill
 //      0x0400(UF_SONG)				Song skill
 //      0x0800(UF_DUALMODE)			Spell has effects both at an interval and when you step in/out
+//      0x1000(UF_NOKNOCKBACK)		Cannot be knocked back (only unit that can be damaged)
 //      0x2000(UF_RANGEDSINGLEUNIT)	Layout hack, use layout range propriety but only display center.
+//      0x4000(UF_REM_CRAZYWEED)	Removed if be overlapped by GN_CRAZYWEED
+//      0x8000(UF_REM_FIRERAIN)		Removed if be overlapped by RL_FIRE_RAIN
 // 	Example: 0x006 = 0x002+0x004 -> Cannot be stacked nor cast near targets
 //
 // Notes:
@@ -27,39 +30,39 @@
 //    u1   u2 lay  r intr target  flag
 //
 
- 12,0x7e,    ,  0, 0,  -1,all,   0x003	//MG_SAFETYWALL
- 18,0x7f,    , -1, 0,  20,enemy, 0x010	//MG_FIREWALL
+ 12,0x7e,    ,  0, 0,  -1,all,   0x4003	//MG_SAFETYWALL
+ 18,0x7f,    , -1, 0,  20,enemy, 0x8010	//MG_FIREWALL
  21,0x86,    ,  0, 2,1000,enemy, 0x018	//MG_THUNDERSTORM
- 25,0x85,    ,  1, 0,  -1,all,   0x2003	//AL_PNEUMA
+ 25,0x85,    ,  1, 0,  -1,all,   0x6003	//AL_PNEUMA
  27,0x81,0x80,  0, 0,  -1,all,   0x00E	//AL_WARP
  47,0x86,    ,  0, 2,1000,enemy, 0x080	//AC_SHOWER
  70,0x83,    , -1, 1,1000,all,   0x018	//PR_SANCTUARY
- 79,0x84,    , -1, 1,3000,enemy, 0x018	//PR_MAGNUS
- 80,0x87,0x88,  0, 1,2000,enemy, 0x006	//WZ_FIREPILLAR
+ 79,0x84,    , -1, 1,3000,enemy, 0x8018	//PR_MAGNUS
+ 80,0x87,0x88,  0, 1,2000,enemy, 0x4006	//WZ_FIREPILLAR
  83,0x86,    ,  0, 3,1000,enemy, 0x010	//WZ_METEOR
  85,0x86,    ,  0, 6:6:6:6:6:6:6:6:6:6:8,1250,enemy,0x018	//WZ_VERMILION
- 87,0x8d,    , -1, 0,  -1,all,   0x010	//WZ_ICEWALL
+ 87,0x8d,    , -1, 0,  -1,all,   0x9010	//WZ_ICEWALL
  89,0x86,    ,  0, 5, 450,enemy, 0x018	//WZ_STORMGUST
  91,0x86,    ,  0, 2,1000,enemy, 0x010	//WZ_HEAVENDRIVE
- 92,0x8e,    ,  2, 0,  -1,enemy, 0x010	//WZ_QUAGMIRE
-115,0x90,    ,  0, 1,1000,enemy, 0x006	//HT_SKIDTRAP
-116,0x93,    ,  0, 1,1000,enemy, 0x006	//HT_LANDMINE
-117,0x91,    ,  0, 1,1000,enemy, 0x006	//HT_ANKLESNARE
-118,0x94,    ,  0, 1,1000,enemy, 0x006	//HT_SHOCKWAVE
-119,0x95,    ,  0, 1,1000,enemy, 0x006	//HT_SANDMAN
-120,0x96,    ,  0, 1,1000,enemy, 0x006	//HT_FLASHER
-121,0x97,    ,  0, 1,1000,enemy, 0x006	//HT_FREEZINGTRAP
-122,0x8f,    ,  0, 1,1000,enemy, 0x006	//HT_BLASTMINE
-123,0x98,    ,  0, 1,1000,enemy, 0x006	//HT_CLAYMORETRAP
-125,0x99,    ,  0, 1,1000,all,   0x000	//HT_TALKIEBOX
-140,0x92,    , -1, 0,1000,enemy, 0x000	//AS_VENOMDUST
-220,0xb0,    ,  0, 0,  -1,all,   0x002	//RG_GRAFFITI
+ 92,0x8e,    ,  2, 0,  -1,enemy, 0x8010	//WZ_QUAGMIRE
+115,0x90,    ,  0, 1,1000,enemy, 0x8006	//HT_SKIDTRAP
+116,0x93,    ,  0, 1,1000,enemy, 0x8006	//HT_LANDMINE
+117,0x91,    ,  0, 1,1000,enemy, 0x9006	//HT_ANKLESNARE
+118,0x94,    ,  0, 1,1000,enemy, 0x8006	//HT_SHOCKWAVE
+119,0x95,    ,  0, 1,1000,enemy, 0x8006	//HT_SANDMAN
+120,0x96,    ,  0, 1,1000,enemy, 0x8006	//HT_FLASHER
+121,0x97,    ,  0, 1,1000,enemy, 0x8006	//HT_FREEZINGTRAP
+122,0x8f,    ,  0, 1,1000,enemy, 0x8006	//HT_BLASTMINE
+123,0x98,    ,  0, 1,1000,enemy, 0x8006	//HT_CLAYMORETRAP
+125,0x99,    ,  0, 1,1000,all,   0x8000	//HT_TALKIEBOX
+140,0x92,    , -1, 0,1000,enemy, 0x8000	//AS_VENOMDUST
+220,0xb0,    ,  0, 0,  -1,all,   0x8002	//RG_GRAFFITI
 229,0xb1,    ,  0, 1,1000,enemy, 0x006	//AM_DEMONSTRATION
 254,0x86,    , -1, 0, 300,enemy, 0x010	//CR_GRANDCROSS
-285,0x9a,    ,  3, 0,  -1,all,   0x010	//SA_VOLCANO
-286,0x9b,    ,  3, 0,  -1,all,   0x010	//SA_DELUGE
-287,0x9c,    ,  3, 0,  -1,all,   0x010	//SA_VIOLENTGALE
-288,0x9d,    ,  3:3:4:4:5,0, -1,all,   0x010	//SA_LANDPROTECTOR
+285,0x9a,    ,  3, 0,  -1,all,   0xC010	//SA_VOLCANO
+286,0x9b,    ,  3, 0,  -1,all,   0xC010	//SA_DELUGE
+287,0x9c,    ,  3, 0,  -1,all,   0xC010	//SA_VIOLENTGALE
+288,0x9d,    ,  3:3:4:4:5,0, -1,all,   0xC010	//SA_LANDPROTECTOR
 306,0x9e,    ,  4, 0,6000,enemy,   0x200	//BD_LULLABY
 307,0x9f,    ,  4, 0,  -1,enemy, 0x220	//BD_RICHMANKIM
 308,0xa0,    ,  4, 0,  -1,enemy, 0x200	//BD_ETERNALCHAOS
@@ -83,77 +86,77 @@
 362,0xb4,    ,  0, 2, 300,all,   0x000	//HP_BASILICA
 369,0xb3,    , -1, 0,10000,all,  0x008	//PA_GOSPEL
 395,0xb5,    ,  4, 0,  -1,all,   0x200	//CG_MOONLIT
-404,0xb6,    , -1, 0,  -1,all,   0x000	//PF_FOGWALL
-405,0xb7,    ,  0, 0,  -1,enemy, 0x000	//PF_SPIDERWEB
+404,0xb6,    , -1, 0,  -1,all,   0x8000	//PF_FOGWALL
+405,0xb7,    ,  0, 0,  -1,enemy, 0x8000	//PF_SPIDERWEB
 409,0xb2,    ,  0,-1,  -1,noone, 0x000	//WE_CALLBABY
 410,0xb2,    ,  0,-1,  -1,noone, 0x000	//WE_CALLPARENT
 428,0x86,    ,  0, 1, 100,enemy, 0x000	//SG_SUN_WARM
 429,0x86,    ,  0, 1, 100,enemy, 0x000	//SG_MOON_WARM
 430,0x86,    ,  0, 1, 100,enemy, 0x000	//SG_STAR_WARM
-484,0xb8,    ,  2, 0,1000,enemy, 0x808	//HW_GRAVITATION
+484,0xb8,    ,  2, 0,1000,enemy, 0x8808	//HW_GRAVITATION
 488,0xb9,    ,  3, 0,  -1,all,   0x200	//CG_HERMODE
 516,0x86,    ,  3, 0, 100,enemy, 0x000	//GS_DESPERADO
 521,0xbe,    ,  0, 1,1000,enemy, 0x000	//GS_GROUNDDRIFT
 527,0xbc,    , -1, 0,2000,enemy, 0x018	//NJ_TATAMIGAESHI
-535,0xbd,    , -1, 0,  20,enemy, 0x010	//NJ_KAENSIN
-538,0xbb,    ,  1:1:1:2:2:2:3:3:3:4,0,-1,all,0x010	//NJ_SUITON
+535,0xbd,    , -1, 0,  20,enemy, 0x8010	//NJ_KAENSIN
+538,0xbb,    ,  1:1:1:2:2:2:3:3:3:4,0,-1,all,0x8010	//NJ_SUITON
 670,0xc7,    ,  1, 4:7:10:13:16:19:22:25:28:31,1000,all,0x008	//NPC_EVILLAND
 
 //706,0xfd,    ,  0, 0,1000,all, 0x000	//NPC_VENOMFOG
 
 2044,0xca,    ,  0, 2,3000,all,   0x018	//AB_EPICLESIS
 
-2032,0xe1,    ,  2, 0,1000,enemy, 0x018	//GC_POISONSMOKE
+2032,0xe1,    ,  2, 0,1000,enemy, 0x8018	//GC_POISONSMOKE
 
 2213,0x86,    ,  0, 9,1000,enemy, 0x018	//WL_COMET
 2214,0x86,    ,  0, 5, 100,enemy, 0x080	//WL_CHAINLIGHTNING
 2216,0xcb,    , -1, 2,2000,enemy, 0x018	//WL_EARTHSTRAIN
 
-2238,0xd8,    ,  0, 1,1000,enemy, 0x006	//RA_ELECTRICSHOCKER
-2239,0xd9,    ,  0, 1,1000,enemy, 0x006	//RA_CLUSTERBOMB
-2249,0xd2,    ,  0, 1,1000,enemy, 0x022	//RA_MAGENTATRAP
-2250,0xd3,    ,  0, 1,1000,enemy, 0x022	//RA_COBALTTRAP
-2251,0xd4,    ,  0, 1,1000,enemy, 0x022	//RA_MAIZETRAP
-2252,0xd5,    ,  0, 1,1000,enemy, 0x022	//RA_VERDURETRAP
-2253,0xd6,    ,  0, 1,1000,enemy, 0x002	//RA_FIRINGTRAP
-2254,0xd7,    ,  0, 1,1000,enemy, 0x002	//RA_ICEBOUNDTRAP
+2238,0xd8,    ,  0, 1,1000,enemy, 0x9006	//RA_ELECTRICSHOCKER
+2239,0xd9,    ,  0, 1,1000,enemy, 0x8006	//RA_CLUSTERBOMB
+2249,0xd2,    ,  0, 1,1000,enemy, 0x8022	//RA_MAGENTATRAP
+2250,0xd3,    ,  0, 1,1000,enemy, 0x8022	//RA_COBALTTRAP
+2251,0xd4,    ,  0, 1,1000,enemy, 0x8022	//RA_MAIZETRAP
+2252,0xd5,    ,  0, 1,1000,enemy, 0x8022	//RA_VERDURETRAP
+2253,0xd6,    ,  0, 1,1000,enemy, 0x8002	//RA_FIRINGTRAP
+2254,0xd7,    ,  0, 1,1000,enemy, 0x8002	//RA_ICEBOUNDTRAP
 
 2273,0xe2,    ,  2, 0, 500,all,   0x000	//NC_NEUTRALBARRIER
 2274,0xe3,    ,  2, 0, 500,friend,0x000	//NC_STEALTHFIELD
 
-2299,0xcc,    ,  0, 1,1000,all,   0x006	 //SC_MANHOLE
-2300,0xcd,    ,  0, 0,1000,all,   0x006	 //SC_DIMENSIONDOOR
-2301,0xce,    ,  2, 0,  -1,all,   0x200E //SC_CHAOSPANIC
-2302,0xcf,    ,  2, 0,  -1,all,   0x2002 //SC_MAELSTROM
-2303,0xd0,    ,  3, 0,  -1,all,   0x2058 //SC_BLOODYLUST
+2299,0xcc,    ,  0, 1,1000,all,   0xC006 //SC_MANHOLE
+2300,0xcd,    ,  0, 0,1000,all,   0xC006 //SC_DIMENSIONDOOR
+2301,0xce,    ,  2, 0,  -1,all,   0xE00E //SC_CHAOSPANIC
+2302,0xcf,    ,  2, 0,  -1,all,   0xE002 //SC_MAELSTROM
+2303,0xd0,    ,  3, 0,  -1,all,   0xE058 //SC_BLOODYLUST
 2304,0xd1,    ,  0, 2, 500,enemy, 0x018  //SC_FEINTBOMB
 
 2319,0xec,    ,  0, 3,5000,all,   0x000	//LG_BANDING
 
-2414,0xda,    ,  0, 0,1000,enemy, 0x008	//WM_REVERBERATION
+2414,0xda,    ,  0, 0,1000,enemy, 0x1008	//WM_REVERBERATION
 2418,0xdb,    ,  0, 5, 300,enemy, 0x800	//WM_SEVERE_RAINSTORM
-2419,0xde,    ,  0, 1,1000,enemy, 0x014 //WM_POEMOFNETHERWORLD
+2419,0xde,    ,  0, 1,1000,enemy, 0x1014 //WM_POEMOFNETHERWORLD
 
 2443,0xdc,    ,  0, 0,1000,enemy, 0x00A	//SO_FIREWALK
 2444,0xdd,    ,  0, 0,1000,enemy, 0x00A	//SO_ELECTRICWALK
 2446,0x86,    ,  0, 3:3:3:4:4,1000,enemy, 0x018	//SO_EARTHGRAVE
 2447,0x86,    ,  0, 3:3:3:4:4,1000,enemy, 0x018	//SO_DIAMONDDUST
 2449,0xdf,    ,  0, 3:3:4:4:5,500,enemy,  0x018	//SO_PSYCHIC_WAVE
-2450,0xe0,    ,  0, 3, 500,enemy, 0x010	//SO_CLOUD_KILL
-2452,0xe4,    ,  0, 3,3000,all,   0x010	//SO_WARMER
-2453,0xeb,    ,  0, 1:1:2:2:3,500,enemy,0x010	//SO_VACUUM_EXTREME
+2450,0xe0,    ,  0, 3, 500,enemy, 0x8010	//SO_CLOUD_KILL
+2452,0xe4,    ,  0, 3,3000,all,   0x8010	//SO_WARMER
+2453,0xeb,    ,  0, 1:1:2:2:3,500,enemy,0x8010	//SO_VACUUM_EXTREME
 2465,0xf1,    ,  0, 1,1000,all,   0x010	//SO_FIRE_INSIGNIA
 2466,0xf2,    ,  0, 1,1000,all,   0x010	//SO_WATER_INSIGNIA
 2467,0xf3,    ,  0, 1,1000,all,   0x010	//SO_WIND_INSIGNIA
 2468,0xf4,    ,  0, 1,1000,all,   0x010	//SO_EARTH_INSIGNIA
 
-2479,0xe5,    ,  0, 1,1000,enemy, 0x006	//GN_THORNS_TRAP
-2482,0xe6,0x7f,  0, 1, 100,all,   0x000	//GN_WALLOFTHORN
+2479,0xe5,    ,  0, 1,1000,enemy, 0xC006	//GN_THORNS_TRAP
+2482,0xe6,0x7f,  0, 1, 100,all,   0xD000	//GN_WALLOFTHORN
 2484,0x86,    ,  0, 1, 100,enemy, 0x080	//GN_CRAZYWEED_ATK
-2485,0xe7,    ,  0, 2,2000,enemy, 0x098	//GN_DEMONIC_FIRE
+2485,0xe7,    ,  0, 2,2000,enemy, 0x8098	//GN_DEMONIC_FIRE
 2487,0xe8,    ,  2, 0,  -1,enemy, 0x2000	//GN_FIRE_EXPANSION_SMOKE_POWDER
 2488,0xe9,    ,  2, 0,  -1,enemy, 0x2000	//GN_FIRE_EXPANSION_TEAR_GAS
-2490,0xea,    ,  0, 1,1000,enemy, 0x002	//GN_HELLS_PLANT
+2490,0xea,    ,  0, 1,1000,enemy, 0x8002	//GN_HELLS_PLANT
 
 2555,0x104,   ,  0, 1:2:2:3:3,500,enemy,0x6	//RL_B_TRAP
 2567,0x105,   , -1, 0,1000,enemy, 0x98	//RL_FIRE_RAIN

+ 1 - 1
db/re/skill_db.txt

@@ -1253,7 +1253,7 @@
 2569,9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0,	RL_AM_BLAST,Anti-Material Blast
 2570,9,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0,	RL_SLUGSHOT,Slug Shot
 2571,7:8:9:10:11,6,2,-1,0x2,2,5,1,no,0,0,0,weapon,0,0x0,	RL_HAMMER_OF_GOD,Hammer of God
-//2572,0,6,1,-1,0x40,0,5,1,no,0,0,0,weapon,0,0,	RL_R_TRIP_PLUSATK,Round Trip Plus Attack
+2572,0,6,1,-1,0x40,0,5,1,no,0,0,0,weapon,0,0,	RL_R_TRIP_PLUSATK,Round Trip Plus Attack
 //2573,0,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0,	RL_B_FLICKER_ATK,Bind Flicker Attack
 //2574,0,6,1,-1,0,0,10,1,no,0,0,0,weapon,0,0,	RL_GLITTERING_GREED_ATK,Flip The Coin Greed Attack
 

+ 1 - 1
db/re/skill_require_db.txt

@@ -911,7 +911,7 @@
 2569,0,0,80:84:88:92:96,0,0,0,17:18:19:20:21,0,0,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0		//RL_AM_BLAST
 2570,0,0,55:60:65:70:75,0,0,0,20,3,1,none,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0					//RL_SLUGSHOT
 2571,0,0,70:80:90:100:110,0,0,0,18,3,0,none,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0				//RL_HAMMER_OF_GOD
-//2572,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0							//RL_R_TRIP_PLUSATK
+2572,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0								//RL_R_TRIP_PLUSATK
 //2573,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0							//RL_B_FLICKER_ATK
 //2574,0,0,1,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0							//RL_GLITTERING_GREED_ATK
 

+ 61 - 58
db/re/skill_unit_db.txt

@@ -18,7 +18,10 @@
 //      0x0200(UF_ENSEMBLE)			Ensemble skill
 //      0x0400(UF_SONG)				Song skill
 //      0x0800(UF_DUALMODE)			Spell has effects both at an interval and when you step in/out
+//      0x1000(UF_NOKNOCKBACK)		Cannot be knocked back (only unit that can be damaged)
 //      0x2000(UF_RANGEDSINGLEUNIT)	Layout hack, use layout range propriety but only display center.
+//      0x4000(UF_REM_CRAZYWEED)	Removed if be overlapped by GN_CRAZYWEED
+//      0x8000(UF_REM_FIRERAIN)		Removed if be overlapped by RL_FIRE_RAIN
 // 	Example: 0x006 = 0x002+0x004 -> Cannot be stacked nor cast near targets
 //
 // Notes:
@@ -27,48 +30,48 @@
 //    u1   u2 lay  r intr target  flag
 //
 
- 12,0x7e,    ,  0, 0,  -1,all,   0x003	//MG_SAFETYWALL
- 18,0x7f,    , -1, 0,  20,enemy, 0x010	//MG_FIREWALL
+ 12,0x7e,    ,  0, 0,  -1,all,   0x4003	//MG_SAFETYWALL
+ 18,0x7f,    , -1, 0,  20,enemy, 0x8010	//MG_FIREWALL
  21,0x86,    ,  0, 2,1000,enemy, 0x018	//MG_THUNDERSTORM
- 25,0x85,    ,  1, 0,  -1,all,   0x2003	//AL_PNEUMA
+ 25,0x85,    ,  1, 0,  -1,all,   0x6003	//AL_PNEUMA
  27,0x81,0x80,  0, 0,  -1,all,   0x00E	//AL_WARP
  47,0x86,    ,  0, 2:2:2:2:2:3:3:3:3:3,1000,enemy, 0x080	//AC_SHOWER
  70,0x83,    , -1, 1,1000,all,   0x018	//PR_SANCTUARY
- 79,0x84,    , -1, 1,3000,enemy, 0x018	//PR_MAGNUS
- 80,0x87,0x88,  0, 1,2000,enemy, 0x006	//WZ_FIREPILLAR
+ 79,0x84,    , -1, 1,3000,enemy, 0x8018	//PR_MAGNUS
+ 80,0x87,0x88,  0, 1,2000,enemy, 0x4006	//WZ_FIREPILLAR
  83,0x86,    ,  0, 3,1000,enemy, 0x010	//WZ_METEOR
  85,0x86,    ,  0, 6:6:6:6:6:6:6:6:6:6:8,1250,enemy,0x018	//WZ_VERMILION
- 87,0x8d,    , -1, 0,  -1,all,   0x010	//WZ_ICEWALL
+ 87,0x8d,    , -1, 0,  -1,all,   0x9010	//WZ_ICEWALL
  89,0x86,    ,  0, 5, 450,enemy, 0x018	//WZ_STORMGUST
  91,0x86,    ,  0, 2,1000,enemy, 0x010	//WZ_HEAVENDRIVE
- 92,0x8e,    ,  2, 0,  -1,enemy, 0x010	//WZ_QUAGMIRE
-115,0x90,    ,  0, 1,1000,enemy, 0x006	//HT_SKIDTRAP
-116,0x93,    ,  0, 1,1000,enemy, 0x006	//HT_LANDMINE
-117,0x91,    ,  0, 1,1000,enemy, 0x006	//HT_ANKLESNARE
-118,0x94,    ,  0, 1,1000,enemy, 0x006	//HT_SHOCKWAVE
-119,0x95,    ,  0, 1,1000,enemy, 0x006	//HT_SANDMAN
-120,0x96,    ,  0, 1,1000,enemy, 0x006	//HT_FLASHER
-121,0x97,    ,  0, 1,1000,enemy, 0x006	//HT_FREEZINGTRAP
-122,0x8f,    ,  0, 1,1000,enemy, 0x006	//HT_BLASTMINE
-123,0x98,    ,  0, 1,1000,enemy, 0x006	//HT_CLAYMORETRAP
-125,0x99,    ,  0, 1,1000,all,   0x000	//HT_TALKIEBOX
-140,0x92,    , -1, 0,1000,enemy, 0x000	//AS_VENOMDUST
-220,0xb0,    ,  0, 0,  -1,all,   0x002	//RG_GRAFFITI
+ 92,0x8e,    ,  2, 0,  -1,enemy, 0x8010	//WZ_QUAGMIRE
+115,0x90,    ,  0, 1,1000,enemy, 0x8006	//HT_SKIDTRAP
+116,0x93,    ,  0, 1,1000,enemy, 0x8006	//HT_LANDMINE
+117,0x91,    ,  0, 1,1000,enemy, 0x9006	//HT_ANKLESNARE
+118,0x94,    ,  0, 1,1000,enemy, 0x8006	//HT_SHOCKWAVE
+119,0x95,    ,  0, 1,1000,enemy, 0x8006	//HT_SANDMAN
+120,0x96,    ,  0, 1,1000,enemy, 0x8006	//HT_FLASHER
+121,0x97,    ,  0, 1,1000,enemy, 0x8006	//HT_FREEZINGTRAP
+122,0x8f,    ,  0, 1,1000,enemy, 0x8006	//HT_BLASTMINE
+123,0x98,    ,  0, 1,1000,enemy, 0x8006	//HT_CLAYMORETRAP
+125,0x99,    ,  0, 1,1000,all,   0x8000	//HT_TALKIEBOX
+140,0x92,    , -1, 0,1000,enemy, 0x8000	//AS_VENOMDUST
+220,0xb0,    ,  0, 0,  -1,all,   0x8002	//RG_GRAFFITI
 229,0xb1,    ,  0, 1,1000,enemy, 0x006	//AM_DEMONSTRATION
 254,0x86,    , -1, 0, 300,enemy, 0x010	//CR_GRANDCROSS
-285,0x9a,    ,  3, 0,  -1,all,   0x010	//SA_VOLCANO
-286,0x9b,    ,  3, 0,  -1,all,   0x010	//SA_DELUGE
-287,0x9c,    ,  3, 0,  -1,all,   0x010	//SA_VIOLENTGALE
-288,0x9d,    ,  3:3:4:4:5,0, -1,all,   0x010	//SA_LANDPROTECTOR
+285,0x9a,    ,  3, 0,  -1,all,   0xC010	//SA_VOLCANO
+286,0x9b,    ,  3, 0,  -1,all,   0xC010	//SA_DELUGE
+287,0x9c,    ,  3, 0,  -1,all,   0xC010	//SA_VIOLENTGALE
+288,0x9d,    ,  3:3:4:4:5,0, -1,all,   0xC010	//SA_LANDPROTECTOR
 306,0x9e,    ,  4, 0,6000,enemy,   0x200	//BD_LULLABY
 307,0x9f,    ,  4, 0,  -1,enemy, 0x220	//BD_RICHMANKIM
-308,0xa0,    ,  4, 0,  -1,enemy, 0x200	//BD_ETERNALCHAOS
+308,0xa0,    ,  4, 0,  -1,enemy, 0x8200	//BD_ETERNALCHAOS
 309,0xa1,    ,  4, 0,  -1,party, 0x200	//BD_DRUMBATTLEFIELD
 310,0xa2,    ,  4, 0,  -1,party, 0x200	//BD_RINGNIBELUNGEN
-311,0xa3,    ,  4, 0,  -1,all,   0x200	//BD_ROKISWEIL
+311,0xa3,    ,  4, 0,  -1,all,   0x8200	//BD_ROKISWEIL
 312,0xa4,    ,  4, 0,  -1,party, 0x240	//BD_INTOABYSS
 313,0xa5,    ,  4, 0,  -1,party, 0x200	//BD_SIEGFRIED
-317,0xa6,    ,  3, 0,3000,enemy, 0x400	//BA_DISSONANCE
+317,0xa6,    ,  3, 0,3000,enemy, 0x8400	//BA_DISSONANCE
 319,0xa7,    ,  3, 0,  -1,all,   0x440	//BA_WHISTLE
 320,0xa8,    ,  3, 0,  -1,all,   0x440	//BA_ASSASSINCROSS
 321,0xa9,    ,  3, 0,  -1,all,   0x440	//BA_POEMBRAGI
@@ -83,21 +86,21 @@
 362,0xb4,    ,  0, 2, 300,all,   0x000	//HP_BASILICA
 369,0xb3,    , -1, 0,10000,all,  0x008	//PA_GOSPEL
 395,0xb5,    ,  4, 0,  -1,all,   0x200	//CG_MOONLIT
-404,0xb6,    , -1, 0,  -1,all,   0x000	//PF_FOGWALL
-405,0xb7,    ,  0, 0,  -1,enemy, 0x000	//PF_SPIDERWEB
+404,0xb6,    , -1, 0,  -1,all,   0x8000	//PF_FOGWALL
+405,0xb7,    ,  0, 0,  -1,enemy, 0x8000	//PF_SPIDERWEB
 409,0xb2,    ,  0,-1,  -1,noone, 0x000	//WE_CALLBABY
 410,0xb2,    ,  0,-1,  -1,noone, 0x000	//WE_CALLPARENT
 428,0x86,    ,  0, 1, 100,enemy, 0x000	//SG_SUN_WARM
 429,0x86,    ,  0, 1, 100,enemy, 0x000	//SG_MOON_WARM
 430,0x86,    ,  0, 1, 100,enemy, 0x000	//SG_STAR_WARM
-484,0xb8,    ,  2, 0, 500,enemy, 0x808	//HW_GRAVITATION
+484,0xb8,    ,  2, 0, 500,enemy, 0x8808	//HW_GRAVITATION
 488,0xb9,    ,  3, 0,  -1,all,   0x200	//CG_HERMODE
 516,0x86,    ,  3, 0, 100,enemy, 0x000	//GS_DESPERADO
 521,0xbe,    ,  0, 1,1000,enemy, 0x000	//GS_GROUNDDRIFT
 525,0x86,    ,  0, 2,1000,enemy, 0x018	//NJ_HUUMA
 527,0xbc,    , -1, 0,2000,enemy, 0x018	//NJ_TATAMIGAESHI
-535,0xbd,    , -1, 0,  20,enemy, 0x010	//NJ_KAENSIN
-538,0xbb,    ,  1:1:1:2:2:2:3:3:3:4,0,-1,all,0x010	//NJ_SUITON
+535,0xbd,    , -1, 0,  20,enemy, 0x8010	//NJ_KAENSIN
+538,0xbb,    ,  1:1:1:2:2:2:3:3:3:4,0,-1,all,0x8010	//NJ_SUITON
 541,0x86,    ,  0, 3:3:4:4:5,1000,enemy, 0x018	//NJ_RAIGEKISAI
 670,0xc7,    ,  1, 4:7:10:13:16:19:22:25:28:31,1000,all,0x008	//NPC_EVILLAND
 
@@ -105,57 +108,57 @@
 
 2044,0xca,    ,  0, 2,3000,all,   0x018	//AB_EPICLESIS
 
-2032,0xe1,    ,  2, 0,1000,enemy, 0x018	//GC_POISONSMOKE
+2032,0xe1,    ,  2, 0,1000,enemy, 0x8018	//GC_POISONSMOKE
 
 2213,0x86,    ,  0, 9,1000,enemy, 0x018	//WL_COMET
 2214,0x86,    ,  0, 5, 100,enemy, 0x080	//WL_CHAINLIGHTNING
 2216,0xcb,    , -1, 2,2000,enemy, 0x018	//WL_EARTHSTRAIN
 
-2238,0xd8,    ,  0, 1,1000,enemy, 0x006	//RA_ELECTRICSHOCKER
-2239,0xd9,    ,  0, 1,1000,enemy, 0x006	//RA_CLUSTERBOMB
-2249,0xd2,    ,  0, 1,1000,enemy, 0x022	//RA_MAGENTATRAP
-2250,0xd3,    ,  0, 1,1000,enemy, 0x022	//RA_COBALTTRAP
-2251,0xd4,    ,  0, 1,1000,enemy, 0x022	//RA_MAIZETRAP
-2252,0xd5,    ,  0, 1,1000,enemy, 0x022	//RA_VERDURETRAP
-2253,0xd6,    ,  0, 1,1000,enemy, 0x002	//RA_FIRINGTRAP
-2254,0xd7,    ,  0, 1,1000,enemy, 0x002	//RA_ICEBOUNDTRAP
+2238,0xd8,    ,  0, 1,1000,enemy, 0x9006	//RA_ELECTRICSHOCKER
+2239,0xd9,    ,  0, 1,1000,enemy, 0x8006	//RA_CLUSTERBOMB
+2249,0xd2,    ,  0, 1,1000,enemy, 0x8022	//RA_MAGENTATRAP
+2250,0xd3,    ,  0, 1,1000,enemy, 0x8022	//RA_COBALTTRAP
+2251,0xd4,    ,  0, 1,1000,enemy, 0x8022	//RA_MAIZETRAP
+2252,0xd5,    ,  0, 1,1000,enemy, 0x8022	//RA_VERDURETRAP
+2253,0xd6,    ,  0, 1,1000,enemy, 0x8002	//RA_FIRINGTRAP
+2254,0xd7,    ,  0, 1,1000,enemy, 0x8002	//RA_ICEBOUNDTRAP
 
 2273,0xe2,    ,  2, 0, 500,all,   0x000	//NC_NEUTRALBARRIER
 2274,0xe3,    ,  2, 0, 500,friend,0x000	//NC_STEALTHFIELD
 
-2299,0xcc,    ,  0, 1,1000,all,   0x006	 //SC_MANHOLE
-2300,0xcd,    ,  0, 0,1000,all,   0x006	 //SC_DIMENSIONDOOR
-2301,0xce,    ,  2, 0,  -1,all,   0x200E //SC_CHAOSPANIC
-2302,0xcf,    ,  2, 0,  -1,all,   0x2002 //SC_MAELSTROM
-2303,0xd0,    ,  3, 0,  -1,all,   0x2058 //SC_BLOODYLUST
+2299,0xcc,    ,  0, 1,1000,all,   0xC006 //SC_MANHOLE
+2300,0xcd,    ,  0, 0,1000,all,   0xC006 //SC_DIMENSIONDOOR
+2301,0xce,    ,  2, 0,  -1,all,   0xC00E //SC_CHAOSPANIC
+2302,0xcf,    ,  2, 0,  -1,all,   0xC002 //SC_MAELSTROM
+2303,0xd0,    ,  3, 0,  -1,all,   0xE058 //SC_BLOODYLUST
 2304,0xd1,    ,  0, 2, 500,enemy, 0x018  //SC_FEINTBOMB
 
 2319,0xec,    ,  0, 3,5000,all,   0x000	//LG_BANDING
 
-2414,0xda,    ,  0, 0,1000,enemy, 0x008	//WM_REVERBERATION
+2414,0xda,    ,  0, 0,1000,enemy, 0x1008	//WM_REVERBERATION
 2418,0xdb,    ,  0, 5, 300,enemy, 0x800	//WM_SEVERE_RAINSTORM
-2419,0xde,    ,  0, 1,1000,enemy, 0x014 //WM_POEMOFNETHERWORLD
+2419,0xde,    ,  0, 1,1000,enemy, 0x1014 //WM_POEMOFNETHERWORLD
 
 2443,0xdc,    ,  0, 0,1000,enemy, 0x00A	//SO_FIREWALK
 2444,0xdd,    ,  0, 0,1000,enemy, 0x00A	//SO_ELECTRICWALK
 2446,0x86,    ,  0, 3:3:3:4:4,1000,enemy, 0x018	//SO_EARTHGRAVE
 2447,0x86,    ,  0, 3:3:3:4:4,1000,enemy, 0x018	//SO_DIAMONDDUST
 2449,0xdf,    ,  0, 3:3:4:4:5,500,enemy,  0x018	//SO_PSYCHIC_WAVE
-2450,0xe0,    ,  0, 3, 500,enemy, 0x010	//SO_CLOUD_KILL
-2452,0xe4,    ,  0, 3,3000,all,   0x010	//SO_WARMER
-2453,0xeb,    ,  0, 1:1:2:2:3,500,enemy,0x010	//SO_VACUUM_EXTREME
+2450,0xe0,    ,  0, 3, 500,enemy, 0x8010	//SO_CLOUD_KILL
+2452,0xe4,    ,  0, 3,3000,all,   0x8010	//SO_WARMER
+2453,0xeb,    ,  0, 1:1:2:2:3,500,enemy,0x8010	//SO_VACUUM_EXTREME
 2465,0xf1,    ,  0, 1,1000,all,   0x010	//SO_FIRE_INSIGNIA
 2466,0xf2,    ,  0, 1,1000,all,   0x010	//SO_WATER_INSIGNIA
 2467,0xf3,    ,  0, 1,1000,all,   0x010	//SO_WIND_INSIGNIA
 2468,0xf4,    ,  0, 1,1000,all,   0x010	//SO_EARTH_INSIGNIA
 
-2479,0xe5,    ,  0, 1,1000,enemy, 0x006	//GN_THORNS_TRAP
-2482,0xe6,0x7f,  0, 1, 100,all,   0x000	//GN_WALLOFTHORN
+2479,0xe5,    ,  0, 1,1000,enemy, 0xC006	//GN_THORNS_TRAP
+2482,0xe6,0x7f,  0, 1, 100,all,   0xD000	//GN_WALLOFTHORN
 2484,0x86,    ,  0, 1, 100,enemy, 0x080	//GN_CRAZYWEED_ATK
-2485,0xe7,    ,  0, 2,2000,enemy, 0x098	//GN_DEMONIC_FIRE
+2485,0xe7,    ,  0, 2,2000,enemy, 0x8098	//GN_DEMONIC_FIRE
 2487,0xe8,    ,  2, 0,  -1,enemy, 0x2000	//GN_FIRE_EXPANSION_SMOKE_POWDER
 2488,0xe9,    ,  2, 0,  -1,enemy, 0x2000	//GN_FIRE_EXPANSION_TEAR_GAS
-2490,0xea,    ,  0, 1,1000,enemy, 0x002	//GN_HELLS_PLANT
+2490,0xea,    ,  0, 1,1000,enemy, 0x8002	//GN_HELLS_PLANT
 
 2555,0x104,   ,  0, 1:2:2:3:3,500,enemy,0x6	//RL_B_TRAP
 2567,0x105,   , -1, 0,1000,enemy, 0x98	//RL_FIRE_RAIN
@@ -177,10 +180,10 @@
 8043,0xf7,    ,  1, 0,-1,all,   0x2018	//MH_VOLCANIC_ASH
 
 8208,0x86,    ,  0, 2,1000,enemy, 0x080	//MA_SHOWER
-8209,0x90,    ,  0, 1,1000,enemy, 0x006	//MA_SKIDTRAP
-8210,0x93,    ,  0, 0,1000,enemy, 0x006	//MA_LANDMINE
-8211,0x95,    ,  0, 1,1000,enemy, 0x006	//MA_SANDMAN
-8212,0x97,    ,  0, 1,1000,enemy, 0x006	//MA_FREEZINGTRAP
+8209,0x90,    ,  0, 1,1000,enemy, 0x8006	//MA_SKIDTRAP
+8210,0x93,    ,  0, 0,1000,enemy, 0x8006	//MA_LANDMINE
+8211,0x95,    ,  0, 1,1000,enemy, 0x8006	//MA_SANDMAN
+8212,0x97,    ,  0, 1,1000,enemy, 0x8006	//MA_FREEZINGTRAP
 
 8403,0xed,    , -1, 1,1000,enemy, 0x018 //EL_FIRE_MANTLE
 8406,0xee,    ,  0, 1,  -1,friend,0x018	//EL_WATER_BARRIER

+ 1 - 1
doc/item_db.txt

@@ -142,7 +142,7 @@ Loc: Equipment's placement. Values are:
 	2^16   65536 = Shadow Armor
 	2^17  131072 = Shadow Weapon
 	2^18  262144 = Shadow Shield
-	2^18  524288 = Shadow Shoes
+	2^19  524288 = Shadow Shoes
 	2^20 1048576 = Shadow Accessory Right (Earring)
 	2^21 2097152 = Shadow Accessory Left (Pendant)
 

+ 4 - 0
src/map/battle.c

@@ -3701,6 +3701,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
 				uint16 lv = skill_lv;
 				skillratio += 100 * skill_check_pc_partner(sd,skill_id,&lv,skill_get_splash(skill_id,skill_lv),0);
 			}
+			RE_LVL_DMOD(100);
 			break;
 		case WM_SOUND_OF_DESTRUCTION:
 			skillratio = (1000 * skill_lv) + (((sd) ? pc_checkskill(sd, WM_LESSON) : skill_get_max(WM_LESSON)) * status_get_int(src));
@@ -3875,6 +3876,9 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
 		case RL_R_TRIP:
 			skillratio += -100 + (150 * skill_lv); //(custom)
 			break;
+		case RL_R_TRIP_PLUSATK:
+			skillratio += -100 + (50 * skill_lv); //(custom)
+			break;
 		case RL_H_MINE:
 			skillratio += 100 + (200 * skill_lv);
 			//If damaged by Flicker

+ 1 - 0
src/map/pc.c

@@ -1589,6 +1589,7 @@ void pc_calc_skilltree(struct map_session_data *sd)
 				case LG_OVERBRAND_BRANDISH:
 				case LG_OVERBRAND_PLUSATK:
 				case WM_SEVERE_RAINSTORM_MELEE:
+				case RL_R_TRIP_PLUSATK:
 					continue;
 				default:
 					break;

+ 85 - 85
src/map/skill.c

@@ -110,6 +110,8 @@ struct s_skill_nounit_layout skill_nounit_layout[MAX_SKILL_UNIT_LAYOUT];
 int overbrand_nounit_pos;
 int overbrand_brandish_nounit_pos;
 
+static char dir_ka = -1; // Holds temporary direction to the target for SR_KNUCKLEARROW
+
 //early declaration
 int skill_block_check(struct block_list *bl, enum sc_type type, uint16 skill_id);
 static int skill_check_unit_range (struct block_list *bl, int x, int y, uint16 skill_id, uint16 skill_lv);
@@ -2345,67 +2347,68 @@ int skill_strip_equip(struct block_list *src,struct block_list *bl, unsigned sho
 static int skill_area_temp[8];
 /*=========================================================================
  Used to knock back players, monsters, traps, etc
- - 'count' is the number of squares to knock back
- - 'direction' indicates the way OPPOSITE to the knockback direction (or -1 for default behavior)
- - if 'flag&0x1', position update packets must not be sent.
- - if 'flag&0x2', skill blown ignores players' special_state.no_knockback
+ * @param src Object that give knock back
+ * @param target Object that receive knock back
+ * @param count Number of knock back cell requested
+ * @param dir Direction indicates the way OPPOSITE to the knockback direction (or -1 for default behavior)
+ * @param flag
+		0x01 - position update packets must not be sent;
+		0x02 - ignores players' special_state.no_knockback;
+		These flags "return 'count' instead of 0 if target is cannot be knocked back":
+		0x04 - at WOE/BG map;
+		0x08 - if target is MD_KNOCKBACK_IMMUNE|MD_BOSS;
+		0x10 - if target has 'special_state.no_knockback';
+		0x20 - if target is in Basilica area;
+ * @return Number of knocked back cells done
  -------------------------------------------------------------------------*/
-int skill_blown(struct block_list* src, struct block_list* target, int count, int8 dir, int flag) {
+short skill_blown(struct block_list* src, struct block_list* target, char count, int8 dir, unsigned char flag) {
 	int dx = 0, dy = 0;
-	struct skill_unit* su = NULL;
 
 	nullpo_ret(src);
+	nullpo_ret(target);
 
-	if (src != target && (map_flag_gvg(target->m) || map[target->m].flag.battleground))
-		return 0; //No knocking back in WoE
 	if (count == 0)
-		return 0; //Actual knockback distance is 0.
+		return count; // Actual knockback distance is 0.
+
+	if (src != target && (map_flag_gvg(target->m) || map[target->m].flag.battleground))
+		return ((flag&0x04) ? count : 0); // No knocking back in WoE
 
 	switch (target->type) {
 		case BL_MOB: {
 				struct mob_data* md = BL_CAST(BL_MOB, target);
 				if( md->mob_id == MOBID_EMPERIUM )
-					return 0;
-				//Bosses or imune can't be knocked-back
+					return count;
+				// Bosses or imune can't be knocked-back
 				if(src != target && status_get_mode(target)&(MD_KNOCKBACK_IMMUNE|MD_BOSS))
-					return 0;
+					return ((flag&0x08) ? count : 0);
 			}
 			break;
 		case BL_PC: {
 				struct map_session_data *sd = BL_CAST(BL_PC, target);
 				if( sd->sc.data[SC_BASILICA] && sd->sc.data[SC_BASILICA]->val4 == sd->bl.id && !is_boss(src))
-					return 0; // Basilica caster can't be knocked-back by normal monsters.
+					return ((flag&0x20) ? count : 0); // Basilica caster can't be knocked-back by normal monsters.
 				if( !(flag&0x2) && src != target && sd->special_state.no_knockback )
-					return 0;
+					return ((flag&0x10) ? count : 0);
 			}
 			break;
-		case BL_SKILL:
-			su = (struct skill_unit *)target;
-
-			if (su && su->group) {
-				switch (su->group->unit_id) {
-					case UNT_ICEWALL:
-					case UNT_ANKLESNARE:
-					case UNT_ELECTRICSHOCKER:
-					case UNT_REVERBERATION:
-					case UNT_NETHERWORLD:
-					case UNT_WALLOFTHORN:
-						return 0; //Cannot be knocked back
-				}
+		case BL_SKILL: {
+				struct skill_unit* su = NULL;
+				su = (struct skill_unit *)target;
+				if (su && su->group && skill_get_unit_flag(su->group->skill_id)&UF_NOKNOCKBACK)
+					return count; // Cannot be knocked back
 			}
 			break;
 	}
 
 	if (dir == -1) // <optimized>: do the computation here instead of outside
-		dir = map_calc_dir(target, src->x, src->y); // direction from src to target, reversed
+		dir = map_calc_dir(target, src->x, src->y); // Direction from src to target, reversed
 
-	if (dir >= 0 && dir < 8)
-	{	// take the reversed 'direction' and reverse it
+	if (dir >= 0 && dir < 8) { // Take the reversed 'direction' and reverse it
 		dx = -dirx[dir];
 		dy = -diry[dir];
 	}
 
-	return unit_blown(target, dx, dy, count, flag);	// send over the proper flag
+	return unit_blown(target, dx, dy, count, flag);	// Send over the proper flag
 }
 
 
@@ -3032,6 +3035,9 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 		case WZ_SIGHTBLASTER:
 			dmg.dmotion = clif_skill_damage(src,bl,tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, flag&SD_LEVEL?-1:skill_lv, 5);
 			break;
+		case RL_R_TRIP_PLUSATK:
+			dmg.dmotion = clif_skill_damage(dsrc,bl,tick,status_get_amotion(src),dmg.dmotion,damage,dmg.div_,skill_id,-1,5);
+			break;
 		case AB_DUPLELIGHT_MELEE:
 		case AB_DUPLELIGHT_MAGIC:
 			dmg.amotion = 300;/* makes the damage value not overlap with previous damage (when displayed by the client) */
@@ -3075,16 +3081,16 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 
 	//Only knockback if it's still alive, otherwise a "ghost" is left behind. [Skotlex]
 	//Reflected spells do not bounce back (bl == dsrc since it only happens for direct skills)
-	if (dmg.blewcount > 0 && bl!=dsrc && !status_isdead(bl)) {
-		int8 dir = -1; // default
-		switch(skill_id) {//direction
+	if (dmg.blewcount > 0 && bl != dsrc && !status_isdead(bl)) {
+		int8 dir = -1; // Default direction
+		// Skill spesific direction
+		switch (skill_id) {
 			case MG_FIREWALL:
 			case PR_SANCTUARY:
 			case SC_TRIANGLESHOT:
-			case SR_KNUCKLEARROW:
 			case GN_WALLOFTHORN:
 			case EL_FIRE_MANTLE:
-				dir = unit_getdir(bl);// backwards
+				dir = unit_getdir(bl); // Backwards
 				break;
 			// This ensures the storm randomly pushes instead of exactly a cell backwards per official mechanics.
 			case WZ_STORMGUST:
@@ -3097,25 +3103,42 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
 				if (battle_config.cart_revo_knockback)
 					dir = 6; // Official servers push target to the West
 				break;
+			case AC_SHOWER:
+				// Direction between target to actual attacker location instead of the unit location (bugreport:1709)
+				if (dsrc != src)
+					dir = map_calc_dir(bl, src->x, src->y);
+				break;
 		}
-		//blown-specific handling
+		// Blown-specific handling
 		switch( skill_id ) {
 			case LG_OVERBRAND_BRANDISH:
-				if( skill_blown(dsrc,bl,dmg.blewcount,dir,0) < dmg.blewcount )
+				// Give knockback damage bonus only hits the wall. (bugreport:9096)
+				if( skill_blown(dsrc,bl,dmg.blewcount,dir,0x04|0x08|0x10|0x20) < dmg.blewcount )
 					skill_addtimerskill(src, tick + status_get_amotion(src), bl->id, 0, 0, LG_OVERBRAND_PLUSATK, skill_lv, BF_WEAPON, flag|SD_ANIMATION);
 				break;
 			case SR_KNUCKLEARROW:
 				if (!(flag&4)) {
-					short i = skill_blown(dsrc, bl, dmg.blewcount, dir, 0);
+					short x = bl->x, y = bl->y;
 
-					if (!map_flag_gvg2(src->m) && !map[src->m].flag.battleground && unit_movepos(src,bl->x,bl->y,1,1)) {
+					// Ignore knockback damage bonus if in WOE (player cannot be knocked in WOE)
+					// Boss & Immune Knockback (mode or from bonus bNoKnockBack) target still remains the damage bonus
+					// (bugreport:9096)
+					if (skill_blown(dsrc, bl, dmg.blewcount, dir_ka, 0x04) < dmg.blewcount)
+						skill_addtimerskill(src, tick + 300 * ((flag&2) ? 1 : 2), bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag|4);
+
+					dir_ka = -1;
+
+					// Move attacker to the target position after knocked back
+					if ((bl->x != x || bl->y != y) && unit_movepos(src,bl->x,bl->y,1,1)) {
 						clif_slide(src, bl->x, bl->y);
 						clif_fixpos(src);
 					}
-					if (i < dmg.blewcount)
-						skill_addtimerskill(src, tick + 300 * ((flag&2) ? 1 : 2), bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag|4);
 				}
 				break;
+			case RL_R_TRIP:
+				if( skill_blown(dsrc,bl,dmg.blewcount,dir,0) < dmg.blewcount )
+					skill_addtimerskill(src, tick + status_get_amotion(src), bl->id, 0, 0, RL_R_TRIP_PLUSATK, skill_lv, BF_WEAPON, flag|SD_ANIMATION);
+				break;
 			default:
 				skill_blown(dsrc,bl,dmg.blewcount,dir, 0x0 );
 				if ( !dmg.blewcount && bl->type == BL_SKILL && damage > 0 ){
@@ -5120,15 +5143,18 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
 		break;
 
 	case SR_KNUCKLEARROW:
-			if( !map_flag_gvg(src->m) && !map[src->m].flag.battleground && unit_movepos(src, bl->x, bl->y, 1, 1) ) {
-				clif_slide(src, bl->x, bl->y);
-				clif_fixpos(src);
-			}
+		// Holds current direction of bl/target to src/attacker before the src is moved to bl location
+		dir_ka = map_calc_dir(bl, src->x, src->y);
+		// Has slide effect even in GVG
+		if( unit_movepos(src, bl->x, bl->y, 1, 1) ) {
+			clif_slide(src, bl->x, bl->y);
+			clif_fixpos(src);
+		}
 
-			if( flag&1 )
-				skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag|SD_LEVEL);
-			else
-				skill_addtimerskill(src, tick + 300, bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag|SD_LEVEL|2);
+		if( flag&1 )
+			skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag|SD_LEVEL);
+		else
+			skill_addtimerskill(src, tick + 300, bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag|SD_LEVEL|2);
 		break;
 
 	case SR_HOWLINGOFLION:
@@ -11490,7 +11516,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
 					case 6: sx = x + w; break;
 					case 7: sy = y + w; sx = x + w; break;
 				}
-				skill_addtimerskill(src,gettick() + (140 * w),0,sx,sy,skill_id,skill_lv,dir,flag);
+				skill_addtimerskill(src,gettick() + (40 * w),0,sx,sy,skill_id,skill_lv,dir,flag);
 			}
 		}
 		break;
@@ -16259,43 +16285,17 @@ static int skill_cell_overlap(struct block_list *bl, va_list ap)
 			}
 			break;
 		case GN_CRAZYWEED_ATK:
-			switch(unit->group->unit_id) {
-				case UNT_WALLOFTHORN:
-				case UNT_THORNS_TRAP:
-				case UNT_MANHOLE:
-				case UNT_DIMENSIONDOOR:
-				case UNT_BLOODYLUST:
-				case UNT_CHAOSPANIC:
-				case UNT_MAELSTROM:
-				case UNT_FIREPILLAR_ACTIVE:
-				case UNT_LANDPROTECTOR:
-				case UNT_VOLCANO:
-				case UNT_DELUGE:
-				case UNT_VIOLENTGALE:
-				case UNT_SAFETYWALL:
-				case UNT_PNEUMA:
-					skill_delunit(unit);
-					return 1;
+			if (unit->group->skill_id == WZ_FIREPILLAR && unit->group->unit_id != UNT_FIREPILLAR_ACTIVE)
+				break;
+			if (skill_get_unit_flag(unit->group->skill_id)&UF_REM_CRAZYWEED) {
+				skill_delunit(unit);
+				return 1;
 			}
 			break;
 		case RL_FIRE_RAIN:
-			switch (unit->group->unit_id) {
-				case UNT_LANDPROTECTOR:	case UNT_ICEWALL:		case UNT_FIREWALL:
-				case UNT_WARMER:		case UNT_CLOUD_KILL:	case UNT_VACUUM_EXTREME:
-				case UNT_SPIDERWEB:		case UNT_FOGWALL:		case UNT_DELUGE:
-				case UNT_VIOLENTGALE:	case UNT_VOLCANO:		case UNT_QUAGMIRE:
-				case UNT_GRAVITATION:	case UNT_MAGNUS:		case UNT_THORNS_TRAP:
-				case UNT_WALLOFTHORN:	case UNT_DEMONIC_FIRE:	case UNT_HELLS_PLANT:
-				case UNT_POISONSMOKE:	case UNT_VENOMDUST:		case UNT_MAELSTROM:
-				case UNT_MANHOLE:		case UNT_DIMENSIONDOOR:	case UNT_GRAFFITI:
-				case UNT_LANDMINE:		case UNT_SANDMAN:		case UNT_SHOCKWAVE:
-				case UNT_SKIDTRAP:		case UNT_ANKLESNARE:	case UNT_CLAYMORETRAP:
-				case UNT_TALKIEBOX:		case UNT_FREEZINGTRAP:	case UNT_VERDURETRAP:
-				case UNT_ICEBOUNDTRAP:	case UNT_FIRINGTRAP:	case UNT_ELECTRICSHOCKER:
-				case UNT_DISSONANCE:	case UNT_ROKISWEIL:		case UNT_ETERNALCHAOS:
-				case UNT_SUITON:		case UNT_KAEN:
-					skill_delunit(unit);
-					return 1;
+			if (skill_get_unit_flag(unit->group->skill_id)&UF_REM_FIRERAIN) {
+				skill_delunit(unit);
+				return 1;
 			}
 			break;
 	}

+ 17 - 14
src/map/skill.h

@@ -253,19 +253,22 @@ struct skill_unit_group_tickset {
 
 
 enum {
-	UF_DEFNOTENEMY   = 0x0001,	// If 'defunit_not_enemy' is set, the target is changed to 'friend'
-	UF_NOREITERATION = 0x0002,	// Spell cannot be stacked
-	UF_NOFOOTSET     = 0x0004,	// Spell cannot be cast near/on targets
-	UF_NOOVERLAP     = 0x0008,	// Spell effects do not overlap
-	UF_PATHCHECK     = 0x0010,	// Only cells with a shootable path will be placed
-	UF_NOPC          = 0x0020,	// May not target players
-	UF_NOMOB         = 0x0040,	// May not target mobs
-	UF_SKILL         = 0x0080,	// May target skills
-	UF_DANCE         = 0x0100,	// Dance
-	UF_ENSEMBLE      = 0x0200,	// Duet
-	UF_SONG          = 0x0400,	// Song
-	UF_DUALMODE      = 0x0800,	// Spells should trigger both ontimer and onplace/onout/onleft effects.
-	UF_RANGEDSINGLEUNIT = 0x2000 // hack for ranged layout, only display center
+	UF_DEFNOTENEMY      = 0x0001,	// If 'defunit_not_enemy' is set, the target is changed to 'friend'
+	UF_NOREITERATION    = 0x0002,	// Spell cannot be stacked
+	UF_NOFOOTSET        = 0x0004,	// Spell cannot be cast near/on targets
+	UF_NOOVERLAP        = 0x0008,	// Spell effects do not overlap
+	UF_PATHCHECK        = 0x0010,	// Only cells with a shootable path will be placed
+	UF_NOPC             = 0x0020,	// May not target players
+	UF_NOMOB            = 0x0040,	// May not target mobs
+	UF_SKILL            = 0x0080,	// May target skills
+	UF_DANCE            = 0x0100,	// Dance
+	UF_ENSEMBLE         = 0x0200,	// Duet
+	UF_SONG             = 0x0400,	// Song
+	UF_DUALMODE         = 0x0800,	// Spells should trigger both ontimer and onplace/onout/onleft effects.
+	UF_NOKNOCKBACK      = 0x1000,	// Skill unit cannot be knocked back
+	UF_RANGEDSINGLEUNIT = 0x2000,	// hack for ranged layout, only display center
+	UF_REM_CRAZYWEED    = 0x4000,	// removed by Crazyweed
+	UF_REM_FIRERAIN     = 0x8000,	// removed by Fire Rain
 };
 
 /// Create Database item
@@ -366,7 +369,7 @@ int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int
 // Results? Added
 int skill_additional_effect( struct block_list* src, struct block_list *bl,uint16 skill_id,uint16 skill_lv,int attack_type,int dmg_lv,unsigned int tick);
 int skill_counter_additional_effect( struct block_list* src, struct block_list *bl,uint16 skill_id,uint16 skill_lv,int attack_type,unsigned int tick);
-int skill_blown(struct block_list* src, struct block_list* target, int count, int8 dir, int flag);
+short skill_blown(struct block_list* src, struct block_list* target, char count, int8 dir, unsigned char flag);
 int skill_break_equip(struct block_list *src,struct block_list *bl, unsigned short where, int rate, int flag);
 int skill_strip_equip(struct block_list *src,struct block_list *bl, unsigned short where, int rate, int lv, int time);
 // Skills unit

+ 4 - 0
src/map/status.c

@@ -2632,6 +2632,8 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) {
 			if(sc->data[SC_EQC])
 				bonus -= sc->data[SC_EQC]->val4;
 		}
+		// Max rate reduce is -100%
+		bonus = cap_value(bonus,-100,INT_MAX);
 	}
 
 	return min(bonus,INT_MAX);
@@ -2704,6 +2706,8 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) {
 			if(sc->data[SC_LIFE_FORCE_F])
 				bonus += sc->data[SC_LIFE_FORCE_F]->val1;
 		}
+		// Max rate reduce is -100%
+		bonus = cap_value(bonus,-100,INT_MAX);
 	}
 
 	return min(bonus,INT_MAX);

+ 2 - 2
src/map/unit.c

@@ -464,7 +464,7 @@ int unit_delay_walktobl_timer(int tid, unsigned int tick, int id, intptr_t data)
  *	&4: Delay walking for can_move
  * @return 1: Success 0: Fail or unit_walktoxy_sub()
  */
-int unit_walktoxy( struct block_list *bl, short x, short y, int flag)
+int unit_walktoxy( struct block_list *bl, short x, short y, unsigned char flag)
 {
 	struct unit_data* ud = NULL;
 	struct status_change* sc = NULL;
@@ -571,7 +571,7 @@ static int unit_walktobl_sub(int tid, unsigned int tick, int id, intptr_t data)
  *	&2: Start attacking upon arrival within range, otherwise just walk to target
  * @return 1: Started walking or set timer 0: Failed
  */
-int unit_walktobl(struct block_list *bl, struct block_list *tbl, int range, int flag)
+int unit_walktobl(struct block_list *bl, struct block_list *tbl, int range, unsigned char flag)
 {
 	struct unit_data *ud = NULL;
 	struct status_change *sc = NULL;

+ 2 - 2
src/map/unit.h

@@ -74,8 +74,8 @@ struct view_data {
 // PC, MOB, PET
 
 // Does walk action for unit
-int unit_walktoxy( struct block_list *bl, short x, short y, int easy);
-int unit_walktobl( struct block_list *bl, struct block_list *target, int range, int easy);
+int unit_walktoxy( struct block_list *bl, short x, short y, unsigned char flag);
+int unit_walktobl( struct block_list *bl, struct block_list *target, int range, unsigned char flag);
 int unit_run(struct block_list *bl);
 int unit_calc_pos(struct block_list *bl, int tx, int ty, uint8 dir);
 int unit_delay_walktoxy_timer(int tid, unsigned int tick, int id, intptr_t data);