Bug Fixes
* Fixed Severe Rainstorm damage formula. (bugreport:8581) * Caster can no longer switch equips for the duration of Severe Rainstorm. (bugreport:8581) * Cleaned up Demonic Fire and Fire Expansion combos. (bugreport:8620) * Fixed Dragon Breath - Fire/Water damage formula and not being reduced by DEF or Flee. (bugreport:8620) * Fixed the movement speed formula for Camouflage. (bugreport:8619) * Fixed Overbrand Brandish area damage. (bugreport:8627) * Fixed cast time for Magical Amplification. * Fixed Moonlit Serenade MATK increase. (bugreport:8697) * Fixed Phantom Thrust not casting. (bugreport:8652) * Fixed Gentle Touch - Cure healing formula. (bugreport:8699) * Fixed Wall of Thorns not dealing damage to players who touch it. (bugreport:8673) * Fixed Flash Combo spirit sphere requirement. (bugreport:8286) * Fixed Feint Bomb damage formula. (bugreport:8593) * Fixed Circling Nature HP recovery and SP consumption being reversed. (bugreport:8670) * Fixed Judex area of effect to be 3x3. (bugreport:8672) * Fixed Abracadabra skill "Summon Monster" not displaying the monster's name. (bugreport:8671) * Fixed Sight Blaster duration. (bugreport:8656) * Fixed Ignition Break area of effect damage. (bugreport:8653) * Fixed Poem of Netherworld not immobilizing enemies. (bugreport:8607) * Fixed Rampage Blaster damage formula. (bugreport:8646) * Adjusted Tiger Cannon damage formula and allow to bypass target's flee. (bugreport:8625) * Fixed Self Destruction not working on self. (bugreport:8633) * Fixed Repair not healing or consuming item requirements. (bugreport:8633) * Fixed Silver Sniper and Magic Decoy AI types not being counted towards the land skill limit. (bugreport:8407) * Fixed Silver Sniper bonus ATK formula. * Fixed Magic Decoy maximum HP formula. * Fixed Lion Howling damage formula. (bugreport:8654) * Fixed Rapid Throw (Muchanage) damage formula. (bugreport:7861) * Stasis no longer allows casting of Chorus skills. * Fixed Chorus skills not checking for additional partners. (bugreport:6052) * Body Paint no longer removes Chase Walk or Invisibility. (bugreport:6801) * Recognized Spell is no longer cleared by Dispell or Abundance. (bugreport:6718) * Epiclesis now removes Cloaking Exceed and will heal while in the Frenzy state. (bugreport:6679) * Renovatio now heals while in the Frenzy state. (bugreport:6679) * Fixed Firing Trap not having the fire element. (bugreport:8707) * Fixed Icebound Trap not having the water element. (bugreport:8707) * Fixed Axe Tornado not doing less damage for targets outside of the 5x5 area of effect. * Updated the list of effects that Inspiration makes the caster immune to. (bugreport:5735) * Cleaned up the effects of Vacuum Extreme to work as it should in GvG maps. (bugreport:6031) * Corrected durations for Millennium Shield, Crush Strike, Refresh, and Weapon Crush.
This commit is contained in:
parent
6bf1c27023
commit
96c768f9b7
@ -1521,7 +1521,7 @@
|
||||
//-- SO_WARMER
|
||||
2452,2200:2400:2600:2800:3000,1000,0,40000:45000:50000:55000:60000,30000,35000:40000:45000:50000:55000
|
||||
//-- SO_VACUUM_EXTREME
|
||||
2453,1000:1500:2000:2500:3000,1000,0,4000:6000:8000:10000:12000,0,5000
|
||||
2453,1000:1500:2000:2500:3000,1000,0,4000:6000:8000:10000:12000,1000,5000
|
||||
//-- SO_VARETYR_SPEAR
|
||||
2454,2200:2400:2600:2800:3000,1000,0,0,2200:2400:2600:2800:3000,2000
|
||||
//-- SO_ARULLO
|
||||
|
@ -886,7 +886,7 @@
|
||||
2005,1,6,2,4,0x2,2,5,1,no,0,0,0,weapon,3,0x0, RK_WINDCUTTER,Wind Cutter
|
||||
2006,0,6,4,-1,0x2,5,5,1,no,0,0,0,weapon,0,0x0, RK_IGNITIONBREAK,Ignition Break
|
||||
2007,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,0x0, RK_DRAGONTRAINING,Dragon Training
|
||||
2008,9,6,2,3,0x2,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,misc,0,0x0, RK_DRAGONBREATH,Dragon Breath
|
||||
2008,9,6,2,3,0x2,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH,Dragon Breath
|
||||
2009,0,6,4,0,0x3,3:4:5:6:7,5,1,no,0,0,0,none,0,0x0, RK_DRAGONHOWLING,Dragon Howling
|
||||
2010,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, RK_RUNEMASTERY,Rune Mastery
|
||||
2011,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, RK_MILLENNIUMSHIELD,Millenium Shield
|
||||
@ -958,7 +958,7 @@
|
||||
|
||||
//****
|
||||
// AB Arch Bishop
|
||||
2038,11,8,1,6,0x2,3,5,-3,yes,0,0,0,magic,0,0x0, AB_JUDEX,Judex
|
||||
2038,11,8,1,6,0x2,1,5,-3,yes,0,0,0,magic,0,0x0, AB_JUDEX,Judex
|
||||
2039,0,6,4,0,0x1,0,1,1,yes,0,0,0,magic,0,0x0, AB_ANCILLA,Ancilla
|
||||
2040,11,8,1,6,0,0,10,-10,yes,0,0,0,magic,0,0x0, AB_ADORAMUS,Adoramus
|
||||
2041,0,6,4,6,0x3,3:7:15,3,1,yes,0,0,0,magic,0,0x0, AB_CLEMENTIA,Crementia
|
||||
@ -1003,8 +1003,8 @@
|
||||
2250,3,6,2,1,0x43,2,1,1,no,0,0x80,1,misc,0,0x0, RA_COBALTTRAP,Cobalt Trap
|
||||
2251,3,6,2,2,0x43,2,1,1,no,0,0x80,1,misc,0,0x0, RA_MAIZETRAP,Maize Trap
|
||||
2252,3,6,2,4,0x43,2,1,1,no,0,0x80,1,misc,0,0x0, RA_VERDURETRAP,Verdure Trap
|
||||
2253,3,6,2,0,0x42,2,5,1,no,0,0x80,2,misc,0,0x2800, RA_FIRINGTRAP,Firing Trap
|
||||
2254,3,6,2,0,0x42,2,5,1,no,0,0x80,2,misc,0,0x2800, RA_ICEBOUNDTRAP,Icebound Trap
|
||||
2253,3,6,2,3,0x42,2,5,1,no,0,0x80,2,misc,0,0x2800, RA_FIRINGTRAP,Firing Trap
|
||||
2254,3,6,2,1,0x42,2,5,1,no,0,0x80,2,misc,0,0x2800, RA_ICEBOUNDTRAP,Icebound Trap
|
||||
|
||||
//****
|
||||
// NC Mechanic
|
||||
@ -1074,7 +1074,7 @@
|
||||
2314,1,6,1,-1,0,0,1,1,no,0,0,0,weapon,0,0x0, LG_RAGEBURST,Rage Burst
|
||||
2315,0,6,4,0:6:0,0x2,0,3,1,yes,0,0,0,none,2:0:0,0x0, LG_SHIELDSPELL,Shield Spell
|
||||
2316,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, LG_EXEEDBREAK,Exceed Break
|
||||
2317,1,6,2,-1,0x2,5,5,1,yes,0,0,0,none,3:4:5:6:7,0x0, LG_OVERBRAND,Over Brand
|
||||
2317,1,6,2,-1,0x2,0,5,1,yes,0,0,0,none,0,0x0, LG_OVERBRAND,Over Brand
|
||||
2318,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, LG_PRESTIGE,Prestige
|
||||
2319,0,6,4,0,0x3,3,5,1,no,0,0,0,weapon,0,0x0, LG_BANDING,Banding //CHECK Splash isnt needed right? Banding has its own UNIT ID.
|
||||
2320,0,6,4,-1,0x2,3,5,1,yes,0,0,0,weapon,0,0x1000, LG_MOONSLASHER,Moon Slasher
|
||||
@ -1083,6 +1083,7 @@
|
||||
2323,0,8,4,2,0x2,1:1:2:2:3,5,-5,yes,0,0,0,weapon,0,0x0, LG_EARTHDRIVE,Earth Drive
|
||||
2324,3,8,1,-1,0,0,5,3,yes,0,0,0,weapon,0,0x0, LG_HESPERUSLIT,Hesperus Lit
|
||||
2325,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, LG_INSPIRATION,Inspiration
|
||||
2519,1,6,1,-1,0x2,0,5,1,yes,0,0,0,weapon,3:4:5:6:7,0x0, LG_OVERBRAND_BRANDISH,Overbrand Brandish
|
||||
|
||||
//****
|
||||
// SR Sura
|
||||
@ -1090,7 +1091,7 @@
|
||||
2327,0,8,4,-1,0x2,2,5,-3,no,0,0,0,weapon,3,0x0, SR_SKYNETBLOW,Sky Net Blow
|
||||
2328,0,6,4,-1,0x2,1:2:3:4:5,5,1,no,0,0,0,weapon,0,0x0, SR_EARTHSHAKER,Earth Shaker
|
||||
2329,-2,8,4,-1,0,0,5,-2,no,0,0x200,0,weapon,0,0x0, SR_FALLENEMPIRE,Fallen Empire
|
||||
2330,-2,6,1,-1,0x2,1:1:1:1:1:2:2:2:2:2,10,1,yes,0,0,0,weapon,0,0x0, SR_TIGERCANNON,Tiger Cannon
|
||||
2330,-2,6,1,-1,0x42,1:1:1:1:1:2:2:2:2:2,10,1,yes,0,0,0,weapon,0,0x0, SR_TIGERCANNON,Tiger Cannon
|
||||
2331,1:2:3:3:4:4:5:5:6:7,6,1,0,0,0,10,0,no,0,0,0,none,0,0x0, SR_HELLGATE,Hell Gate
|
||||
2332,0,6,4,-1,0x2,3,5,1,no,0,0,0,weapon,0,0x0, SR_RAMPAGEBLASTER,Rampage Blaster
|
||||
2333,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_CRESCENTELBOW,Crescent Elbow //CHECK Check the autospell ID.
|
||||
|
@ -691,11 +691,11 @@
|
||||
|
||||
2267,0,0,1,0,0,0,99,0,0,mado,0,0,6146,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2802 //NC_SELFDESTRUCTION#Self Destruction#
|
||||
2268,0,0,100,0,0,0,99,0,0,mado,0,0,6360,1,6363,1,6362,1,6361,1,6146,2,0,0,0,0,0,0,0,0,0,0,2803 //NC_SHAPESHIFT#Shape Shift#
|
||||
2269,0,0,20,0,0,0,99,0,0,mado,0,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2804 //NC_EMERGENCYCOOL#Emergency Cool#
|
||||
2269,0,0,20,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2804 //NC_EMERGENCYCOOL#Emergency Cool#
|
||||
2270,0,0,45,0,0,0,99,0,0,mado,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_INFRAREDSCAN#Infrared Scan#
|
||||
2271,0,0,30,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_ANALYZE#Analyze#
|
||||
2272,0,0,90,0,0,0,99,0,0,mado,0,0,2805,0,6146,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2805 //NC_MAGNETICFIELD#Magnetic Field#
|
||||
2273,0,0,90,0,0,0,99,0,0,mado,0,0,2806,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2806 //NC_NEUTRALBARRIER#Neutral Barrier#
|
||||
2272,0,0,90,0,0,0,99,0,0,mado,0,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2805 //NC_MAGNETICFIELD#Magnetic Field#
|
||||
2273,0,0,90,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2806 //NC_NEUTRALBARRIER#Neutral Barrier#
|
||||
2274,0,0,100:150:200,0,0,0,99,0,0,mado,0,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2808 //NC_STEALTHFIELD#Stealth Field#
|
||||
2275,0,0,25:30:35:40:45,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2807 //NC_REPAIR#Repair#
|
||||
|
||||
|
@ -149,7 +149,7 @@
|
||||
2468,0xf4, , 0, 1,1000,all, 0x010 //SO_EARTH_INSIGNIA
|
||||
|
||||
2479,0xe5, , 0, 1,1000,enemy, 0x006 //GN_THORNS_TRAP
|
||||
2482,0xe6,0x7f, -1, 1, 100,all, 0x000 //GN_WALLOFTHORN
|
||||
2482,0xe6,0x7f, -1, 2, -1,all, 0x000 //GN_WALLOFTHORN
|
||||
2484,0x86, , 0, 1, 100,enemy, 0x080 //GN_CRAZYWEED_ATK
|
||||
2485,0xe7, , 0, 2,2000,enemy, 0x098 //GN_DEMONIC_FIRE
|
||||
2487,0xe8, , 0, 2, 500,enemy, 0x000 //GN_FIRE_EXPANSION_SMOKE_POWDER
|
||||
|
@ -69,7 +69,7 @@
|
||||
//-- AL_INCAGI
|
||||
29,1000,1000,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0,0,0
|
||||
//-- AL_DECAGI
|
||||
30,750,1000,0,40000:50000:60000:70000:80000:90000:100000:110000:120000:130000:130000,0,0,250
|
||||
30,750,1000,0,40000:50000:60000:70000:80000:90000:100000:110000:120000:130000,0,0,250
|
||||
//-- AL_HOLYWATER
|
||||
31,1000,500,0,0,0,0,0
|
||||
//-- AL_CRUCIS
|
||||
@ -553,7 +553,7 @@
|
||||
//-- HW_MAGICCRASHER
|
||||
365,300,300,0,0,0,0,0
|
||||
//-- HW_MAGICPOWER
|
||||
366,0,0,0,30000,0,0,0
|
||||
366,0,0,0,30000,0,0,700
|
||||
//==========================================
|
||||
|
||||
|
||||
@ -1087,11 +1087,11 @@
|
||||
//-- RK_DRAGONHOWLING
|
||||
2009,0,0,0,15000,0,10000,-1
|
||||
//-- RK_MILLENNIUMSHIELD
|
||||
2011,0,1000,0,180000,1000,60000,-1
|
||||
2011,0,1000,0,180000,60000,0,-1
|
||||
//-- RK_CRUSHSTRIKE
|
||||
2012,0,0,0,30000,0,30000,1000
|
||||
2012,0,0,0,30000,30000,0,1000
|
||||
//-- RK_REFRESH
|
||||
2013,0,0,0,60000,0,120000,1000
|
||||
2013,0,0,0,60000,120000,0,1000
|
||||
//-- RK_GIANTGROWTH
|
||||
2014,0,0,0,180000,0,0,1000
|
||||
//-- RK_STONEHARDSKIN
|
||||
@ -1105,7 +1105,7 @@
|
||||
//-- RK_ABUNDANCE
|
||||
2019,0,0,0,180000,0,0,-1
|
||||
//-- RK_DRAGONBREATH_WATER
|
||||
5004,0:0:0:1000:1000:1000:1500:1500:2000:2000,2000,0,40000,0,0,500
|
||||
5004,0:0:0:1000:1000:1000:1500:1500:2000:2000,2000,0,10000,0,0,500
|
||||
//-- RK_LUXANIMA
|
||||
5005,0,0,0,60000,0,0,-1
|
||||
//==========================================
|
||||
@ -1126,7 +1126,7 @@
|
||||
//-- GC_COUNTERSLASH
|
||||
2029,0,2000,0,0,0,0,-1
|
||||
//-- GC_WEAPONCRUSH
|
||||
2030,0,1000,0,75000:90000:105000:120000:135000,0,0,-1
|
||||
2030,0,1000,0,60000,0,0,-1
|
||||
//-- GC_VENOMPRESSURE
|
||||
2031,0,1000,0,0,0,0,-1
|
||||
//-- GC_POISONSMOKE
|
||||
@ -1527,7 +1527,7 @@
|
||||
//-- SO_SPELLFIST
|
||||
2445,0,1000,0,20000:25000:30000:35000:40000,0,0,0
|
||||
//-- SO_EARTHGRAVE
|
||||
2446,2200:2400:2600:2800:3000,1000,0,500,8000:11000:14000:17000:20000,5000,1800:1600:1400:1200:800
|
||||
2446,2200:2400:2600:2800:3000,1000,0,500,8000:11000:14000:17000:20000,5000,1800:1600:1400:1200:1000
|
||||
//-- SO_DIAMONDDUST
|
||||
2447,5000:5500:6000:6500:7000,1000,0,500,12000:14000:16000:18000:20000,5000,800:600:400:200:-1
|
||||
//-- SO_POISON_BUSTER
|
||||
@ -1541,7 +1541,7 @@
|
||||
//-- SO_WARMER
|
||||
2452,2200:2400:2600:2800:3000,1000,0,40000:45000:50000:55000:60000,30000,35000:40000:45000:50000:55000,1800:1600:1400:1200:1000
|
||||
//-- SO_VACUUM_EXTREME
|
||||
2453,1000:1500:2000:2500:3000,1000,0,4000:6000:8000:10000:12000,0,5000,0
|
||||
2453,1000:1500:2000:2500:3000,1000,0,4000:6000:8000:10000:12000,1000,5000,-1
|
||||
//-- SO_VARETYR_SPEAR
|
||||
2454,2200:2400:2600:2800:3000,1000,0,0,2200:2400:2600:2800:3000,2000,1800:1600:1400:1200:1000
|
||||
//-- SO_ARULLO
|
||||
|
@ -886,7 +886,7 @@
|
||||
2005,1,6,2,4,0x2,2,5,1,no,0,0,0,weapon,3,0x0, RK_WINDCUTTER,Wind Cutter
|
||||
2006,0,6,4,-1,0x2,5,5,1,no,0,0,0,weapon,0,0x0, RK_IGNITIONBREAK,Ignition Break
|
||||
2007,0,0,0,0,0,0,5,0,no,0,0,0,weapon,0,0x0, RK_DRAGONTRAINING,Dragon Training
|
||||
2008,9,6,2,3,0x2,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,misc,0,0x0, RK_DRAGONBREATH,Dragon Breath
|
||||
2008,9,6,2,3,0x2,1:1:1:2:2:2:3:3:4:4,10,1,no,0,0,0,weapon,0,0x0, RK_DRAGONBREATH,Dragon Breath
|
||||
2009,0,6,4,0,0x3,3:4:5:6:7,5,1,no,0,0,0,none,0,0x0, RK_DRAGONHOWLING,Dragon Howling
|
||||
2010,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x0, RK_RUNEMASTERY,Rune Mastery
|
||||
2011,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, RK_MILLENNIUMSHIELD,Millenium Shield
|
||||
@ -958,7 +958,7 @@
|
||||
|
||||
//****
|
||||
// AB Arch Bishop
|
||||
2038,11,8,1,6,0x2,3,5,-3,yes,0,0,0,magic,0,0x0, AB_JUDEX,Judex
|
||||
2038,11,8,1,6,0x2,1,5,-3,yes,0,0,0,magic,0,0x0, AB_JUDEX,Judex
|
||||
2039,0,6,4,0,0x1,0,1,1,yes,0,0,0,magic,0,0x0, AB_ANCILLA,Ancilla
|
||||
2040,11,8,1,6,0,0,10,-10,yes,0,0,0,magic,0,0x0, AB_ADORAMUS,Adoramus
|
||||
2041,0,6,4,6,0x3,3:7:15,3,1,yes,0,0,0,magic,0,0x0, AB_CLEMENTIA,Crementia
|
||||
@ -1003,8 +1003,8 @@
|
||||
2250,3,6,2,1,0x43,2,1,1,no,0,0x80,1,misc,0,0x0, RA_COBALTTRAP,Cobalt Trap
|
||||
2251,3,6,2,2,0x43,2,1,1,no,0,0x80,1,misc,0,0x0, RA_MAIZETRAP,Maize Trap
|
||||
2252,3,6,2,4,0x43,2,1,1,no,0,0x80,1,misc,0,0x0, RA_VERDURETRAP,Verdure Trap
|
||||
2253,3,6,2,0,0x42,2,5,1,no,0,0x80,2,misc,0,0x2800, RA_FIRINGTRAP,Firing Trap
|
||||
2254,3,6,2,0,0x42,2,5,1,no,0,0x80,2,misc,0,0x2800, RA_ICEBOUNDTRAP,Icebound Trap
|
||||
2253,3,6,2,3,0x42,2,5,1,no,0,0x80,2,misc,0,0x2800, RA_FIRINGTRAP,Firing Trap
|
||||
2254,3,6,2,1,0x42,2,5,1,no,0,0x80,2,misc,0,0x2800, RA_ICEBOUNDTRAP,Icebound Trap
|
||||
|
||||
//****
|
||||
// NC Mechanic
|
||||
@ -1074,7 +1074,7 @@
|
||||
2314,1,6,1,-1,0,0,1,1,no,0,0,0,weapon,0,0x0, LG_RAGEBURST,Rage Burst
|
||||
2315,0,6,4,0:6:0,0x2,0,3,1,yes,0,0,0,none,2:0:0,0x0, LG_SHIELDSPELL,Shield Spell
|
||||
2316,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, LG_EXEEDBREAK,Exceed Break
|
||||
2317,1,6,2,-1,0x2,5,5,1,yes,0,0,0,none,3:4:5:6:7,0x0, LG_OVERBRAND,Over Brand
|
||||
2317,1,6,2,-1,0x2,0,5,1,yes,0,0,0,none,0,0x0, LG_OVERBRAND,Over Brand
|
||||
2318,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, LG_PRESTIGE,Prestige
|
||||
2319,0,6,4,0,0x3,3,5,1,no,0,0,0,weapon,0,0x0, LG_BANDING,Banding //CHECK Splash isnt needed right? Banding has its own UNIT ID.
|
||||
2320,0,6,4,-1,0x2,3,5,1,yes,0,0,0,weapon,0,0x1000, LG_MOONSLASHER,Moon Slasher
|
||||
@ -1083,6 +1083,7 @@
|
||||
2323,0,8,4,2,0x2,1:1:2:2:3,5,-5,yes,0,0,0,weapon,0,0x0, LG_EARTHDRIVE,Earth Drive
|
||||
2324,3,8,1,-1,0,0,5,3,yes,0,0,0,weapon,0,0x0, LG_HESPERUSLIT,Hesperus Lit
|
||||
2325,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, LG_INSPIRATION,Inspiration
|
||||
2519,1,6,1,-1,0x2,0,5,1,yes,0,0,0,weapon,3:4:5:6:7,0x0, LG_OVERBRAND_BRANDISH,Overbrand Brandish
|
||||
|
||||
//****
|
||||
// SR Sura
|
||||
@ -1090,7 +1091,7 @@
|
||||
2327,0,8,4,-1,0x2,2,5,-3,no,0,0,0,weapon,3,0x0, SR_SKYNETBLOW,Sky Net Blow
|
||||
2328,0,6,4,-1,0x2,1:2:3:4:5,5,1,no,0,0,0,weapon,0,0x0, SR_EARTHSHAKER,Earth Shaker
|
||||
2329,-2,8,4,-1,0,0,5,-2,no,0,0x200,0,weapon,0,0x0, SR_FALLENEMPIRE,Fallen Empire
|
||||
2330,-2,6,1,-1,0x2,1:1:1:1:1:2:2:2:2:2,10,1,yes,0,0,0,weapon,0,0x0, SR_TIGERCANNON,Tiger Cannon
|
||||
2330,-2,6,1,-1,0x42,1:1:1:1:1:2:2:2:2:2,10,1,yes,0,0,0,weapon,0,0x0, SR_TIGERCANNON,Tiger Cannon
|
||||
2331,1:2:3:3:4:4:5:5:6:7,6,1,0,0,0,10,0,no,0,0,0,none,0,0x0, SR_HELLGATE,Hell Gate
|
||||
2332,0,6,4,-1,0x2,3,5,1,no,0,0,0,weapon,0,0x0, SR_RAMPAGEBLASTER,Rampage Blaster
|
||||
2333,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_CRESCENTELBOW,Crescent Elbow //CHECK Check the autospell ID.
|
||||
|
@ -691,11 +691,11 @@
|
||||
|
||||
2267,0,0,1,0,0,0,99,0,0,mado,0,0,6146,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2802 //NC_SELFDESTRUCTION#Self Destruction#
|
||||
2268,0,0,100,0,0,0,99,0,0,mado,0,0,6360,1,6363,1,6362,1,6361,1,6146,2,0,0,0,0,0,0,0,0,0,0,2803 //NC_SHAPESHIFT#Shape Shift#
|
||||
2269,0,0,20,0,0,0,99,0,0,mado,0,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2804 //NC_EMERGENCYCOOL#Emergency Cool#
|
||||
2269,0,0,20,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2804 //NC_EMERGENCYCOOL#Emergency Cool#
|
||||
2270,0,0,45,0,0,0,99,0,0,mado,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_INFRAREDSCAN#Infrared Scan#
|
||||
2271,0,0,30,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_ANALYZE#Analyze#
|
||||
2272,0,0,90,0,0,0,99,0,0,mado,0,0,2805,0,6146,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2805 //NC_MAGNETICFIELD#Magnetic Field#
|
||||
2273,0,0,90,0,0,0,99,0,0,mado,0,0,2806,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2806 //NC_NEUTRALBARRIER#Neutral Barrier#
|
||||
2272,0,0,90,0,0,0,99,0,0,mado,0,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2805 //NC_MAGNETICFIELD#Magnetic Field#
|
||||
2273,0,0,90,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2806 //NC_NEUTRALBARRIER#Neutral Barrier#
|
||||
2274,0,0,100:150:200,0,0,0,99,0,0,mado,0,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2808 //NC_STEALTHFIELD#Stealth Field#
|
||||
2275,0,0,25:30:35:40:45,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2807 //NC_REPAIR#Repair#
|
||||
|
||||
@ -963,13 +963,13 @@
|
||||
5005,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 //RK_LUXANIMA#Lux Anima#
|
||||
5006,0,0,60:70:80:90:100,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 //NC_MAGMA_ERUPTION#Magma Eruption#
|
||||
5007,0,0,200:230:260:290:320,0,0,0,13:14,0,0,none,0,0,6144,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //WM_FRIGG_SONG#Frigg's Song#
|
||||
5008,0,0,120:120:120:120:120,0,0,0,99,0,0,elementalspirit,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_ELEMENTAL_SHIELD#Elemental Shield#
|
||||
5009,0,0,75:65:55:45:35,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 //SR_FLASHCOMBO#Flash Combo#
|
||||
5008,0,0,120,0,0,0,99,0,0,elementalspirit,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SO_ELEMENTAL_SHIELD#Elemental Shield#
|
||||
5009,0,0,75:65:55:45:35,0,0,0,99,0,0,none,5:5:4:4:3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SR_FLASHCOMBO#Flash Combo#
|
||||
5010,0,0,30:26:22:18:14,0,0,0,99,0,0,none,0,0,7940,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //SC_ESCAPE#Emergency Escape#
|
||||
5011,0,0,30:60:90:120:150,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 //AB_OFFERTORIUM#Offertorium#
|
||||
5012,0,0,100:150:200:250:300,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 //WL_TELEKINESIS_INTENSE#Intense Telekinesis#
|
||||
5013,0,0,200:180:160:140:120,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 //LG_KINGS_GRACE#King's Grace#
|
||||
5014,0,0,1:1:1:1: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 //ALL_FULL_THROTTLE#Full Throttle#
|
||||
5014,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 //ALL_FULL_THROTTLE#Full Throttle#
|
||||
5015,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 //SR_FLASHCOMBO_ATK_STEP1#Flash Combo Attack Step 1#//All 4 steps are using temp req SP values for now.
|
||||
5016,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 //SR_FLASHCOMBO_ATK_STEP2#Flash Combo Attack Step 2#
|
||||
5017,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 //SR_FLASHCOMBO_ATK_STEP3#Flash Combo Attack Step 3#
|
||||
|
@ -151,7 +151,7 @@
|
||||
2468,0xf4, , 0, 1,1000,all, 0x010 //SO_EARTH_INSIGNIA
|
||||
|
||||
2479,0xe5, , 0, 1,1000,enemy, 0x006 //GN_THORNS_TRAP
|
||||
2482,0xe6,0x7f, -1, 1, 100,all, 0x000 //GN_WALLOFTHORN
|
||||
2482,0xe6,0x7f, -1, 2, -1,all, 0x000 //GN_WALLOFTHORN
|
||||
2484,0x86, , 0, 1, 100,enemy, 0x080 //GN_CRAZYWEED_ATK
|
||||
2485,0xe7, , 0, 2,2000,enemy, 0x098 //GN_DEMONIC_FIRE
|
||||
2487,0xe8, , 0, 2, 500,enemy, 0x000 //GN_FIRE_EXPANSION_SMOKE_POWDER
|
||||
|
@ -6006,7 +6006,7 @@ ACMD_FUNC(autoloottype)
|
||||
{
|
||||
uint8 i = 0, action = 3; // 1=add, 2=remove, 3=help+list (default), 4=reset
|
||||
enum item_types type = -1;
|
||||
int ITEM_NONE = 0, ITEM_MAX = 1533;
|
||||
int ITEM_MAX = 1533;
|
||||
|
||||
nullpo_retr(-1, sd);
|
||||
|
||||
@ -6058,7 +6058,6 @@ ACMD_FUNC(autoloottype)
|
||||
clif_displaymessage(fd, msg_txt(sd,1482)); // Your autoloottype list has all item types. You can remove some items with @autoloottype -<type name or ID>.
|
||||
return -1;
|
||||
}
|
||||
sd->state.autolootingtype = 1; // Autoloot Activated
|
||||
sd->state.autoloottype |= (1<<type); // Stores the type
|
||||
sprintf(atcmd_output, msg_txt(sd,1483), itemdb_typename(type), type); // Autolooting item type: '%s' {%d}
|
||||
clif_displaymessage(fd, atcmd_output);
|
||||
@ -6071,14 +6070,12 @@ ACMD_FUNC(autoloottype)
|
||||
sd->state.autoloottype &= ~(1<<type);
|
||||
sprintf(atcmd_output, msg_txt(sd,1485), itemdb_typename(type), type); // Removed item type: '%s' {%d} from your autoloottype list.
|
||||
clif_displaymessage(fd, atcmd_output);
|
||||
if (sd->state.autoloottype == ITEM_NONE)
|
||||
sd->state.autolootingtype = 0;
|
||||
break;
|
||||
case 3:
|
||||
clif_displaymessage(fd, msg_txt(sd,1486)); // To add an item type to the list, use "@aloottype +<type name or ID>". To remove an item type, use "@aloottype -<type name or ID>".
|
||||
clif_displaymessage(fd, msg_txt(sd,1487)); // Type List: healing = 0, usable = 2, etc = 3, armor = 4, weapon = 5, card = 6, petegg = 7, petarmor = 8, ammo = 10
|
||||
clif_displaymessage(fd, msg_txt(sd,1488)); // "@aloottype reset" will clear your autoloottype list.
|
||||
if (sd->state.autoloottype == ITEM_NONE)
|
||||
if (sd->state.autoloottype == 0)
|
||||
clif_displaymessage(fd, msg_txt(sd,1489)); // Your autoloottype list is empty.
|
||||
else {
|
||||
clif_displaymessage(fd, msg_txt(sd,1490)); // Item types on your autoloottype list:
|
||||
@ -6092,8 +6089,7 @@ ACMD_FUNC(autoloottype)
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
sd->state.autoloottype = ITEM_NONE;
|
||||
sd->state.autolootingtype = 0;
|
||||
sd->state.autoloottype = 0;
|
||||
clif_displaymessage(fd, msg_txt(sd,1491)); // Your autoloottype list has been reset.
|
||||
break;
|
||||
}
|
||||
|
@ -3205,22 +3205,21 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
|
||||
skillratio = (skill_lv + 2) * 50;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case RK_IGNITIONBREAK:
|
||||
{
|
||||
case RK_IGNITIONBREAK: {
|
||||
// 3x3 cell Damage = ATK [{(Skill Level x 300) x (1 + [(Caster's Base Level - 100) / 100])}] %
|
||||
// 7x7 cell Damage = ATK [{(Skill Level x 250) x (1 + [(Caster's Base Level - 100) / 100])}] %
|
||||
// 11x11 cell Damage = ATK [{(Skill Level x 200) x (1 + [(Caster's Base Level - 100) / 100])}] %
|
||||
int dmg = 300; // Base maximum damage at less than 3 cells.
|
||||
i = distance_bl(src,target);
|
||||
if( i > 7 )
|
||||
dmg -= 100; // Greater than 7 cells. (200 damage)
|
||||
else if( i > 3 )
|
||||
dmg -= 50; // Greater than 3 cells, less than 7. (250 damage)
|
||||
dmg = (dmg * skill_lv) * (100 + (status_get_lv(src) - 100) / 12) / 100;
|
||||
if( i < 2 )
|
||||
skillratio = 300 * skill_lv;
|
||||
else if( i < 4 )
|
||||
skillratio = 250 * skill_lv;
|
||||
else
|
||||
skillratio = 200 * skill_lv;
|
||||
skillratio = skillratio * status_get_lv(src) / 100;
|
||||
// Elemental check, 1.5x damage if your element is fire.
|
||||
if( sstatus->rhw.ele == ELE_FIRE )
|
||||
dmg += dmg/2;
|
||||
skillratio = dmg;
|
||||
skillratio += 100 * skill_lv;
|
||||
}
|
||||
break;
|
||||
case RK_CRUSHSTRIKE:
|
||||
@ -3343,6 +3342,8 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
|
||||
case NC_AXETORNADO:
|
||||
skillratio += 100 + 100 * skill_lv + status_get_vit(src);
|
||||
RE_LVL_DMOD(100);
|
||||
if ( distance_bl(src, target) > 2 ) // Will deal 75% damage outside of 5x5 area.
|
||||
skillratio = skillratio * 75 / 100;
|
||||
break;
|
||||
case SC_FATALMENACE:
|
||||
skillratio += 100 * skill_lv;
|
||||
@ -3352,7 +3353,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
|
||||
RE_LVL_DMOD(120);
|
||||
break;
|
||||
case SC_FEINTBOMB:
|
||||
skillratio = (skill_lv + 1) * (status_get_dex(src) / 2) * (sd?(sd->status.job_level / 10):5);
|
||||
skillratio = (skill_lv + 1) * (status_get_dex(src) / 2) * ((sd) ? sd->status.job_level : 1) / 10;
|
||||
RE_LVL_DMOD(120);
|
||||
break;
|
||||
case LG_CANNONSPEAR:
|
||||
@ -3408,11 +3409,11 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case LG_OVERBRAND_BRANDISH:
|
||||
skillratio = 100 * skill_lv + (status_get_str(src) + status_get_dex(src));
|
||||
skillratio = 100 * skill_lv + status_get_str(src) + status_get_dex(src);
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case LG_OVERBRAND_PLUSATK: // Only Piercing and Swing damage get RE_LVL_DMOD bonus damage
|
||||
skillratio = (100 * skill_lv) + rnd()%90 + 10;
|
||||
skillratio = 100 * skill_lv + rnd()%90 + 10;
|
||||
break;
|
||||
case LG_RAYOFGENESIS:
|
||||
skillratio = 300 + 300 * skill_lv;
|
||||
@ -3471,15 +3472,16 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
|
||||
{
|
||||
int hp = (int64)status_get_max_hp(src) * (10 + 2 * skill_lv) / 100,
|
||||
sp = (int64)status_get_max_sp(src) * (5 + 1 * skill_lv) / 100;
|
||||
skillratio = ((int64)hp+sp) / 4;
|
||||
if( sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE ) // ATK [((Caster consumed HP + SP) / 2) x Caster Base Level / 100] %
|
||||
skillratio = ((int64)hp+sp) / 2;
|
||||
else
|
||||
skillratio = ((int64)hp+sp) / 4;
|
||||
RE_LVL_DMOD(100);
|
||||
}
|
||||
break;
|
||||
case SR_RAMPAGEBLASTER:
|
||||
if( sc && sc->data[SC_EXPLOSIONSPIRITS] ) {
|
||||
skillratio = (20 * ((sd) ? sd->spiritball_old : 5) + 20 * sc->data[SC_EXPLOSIONSPIRITS]->val1) * skill_lv;
|
||||
skillratio = 20 * skill_lv + ((sd) ? sd->spiritball_old : 5) + 20 * sc->data[SC_EXPLOSIONSPIRITS]->val1;
|
||||
RE_LVL_DMOD(120);
|
||||
} else {
|
||||
skillratio = 20 * ((sd) ? sd->spiritball_old : 5) * skill_lv;
|
||||
@ -3514,7 +3516,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case SR_HOWLINGOFLION:
|
||||
skillratio += 200 * skill_lv;
|
||||
skillratio = 300 * skill_lv;
|
||||
RE_LVL_DMOD(150);
|
||||
break;
|
||||
case SR_RIDEINLIGHTNING: // ATK [{(Skill Level x 200) + Additional Damage} x Caster Base Level / 100] %
|
||||
@ -3530,7 +3532,7 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
|
||||
break;
|
||||
case WM_SEVERE_RAINSTORM_MELEE:
|
||||
//ATK [{(Caster DEX + AGI) x (Skill Level / 5)} x Caster Base Level / 100] %
|
||||
skillratio = (status_get_dex(src) + status_get_agi(src)) * (skill_lv / 5);
|
||||
skillratio = (status_get_dex(src) + status_get_agi(src)) * skill_lv / 5;
|
||||
RE_LVL_DMOD(100);
|
||||
break;
|
||||
case WM_GREAT_ECHO:
|
||||
@ -3785,25 +3787,23 @@ static int battle_calc_skill_constant_addition(struct Damage wd, struct block_li
|
||||
break;
|
||||
case SR_GATEOFHELL:
|
||||
atk = (status_get_max_hp(src) - status_get_hp(src));
|
||||
if(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE) {
|
||||
atk += ( ((int64)status_get_max_sp(src) * (1 + skill_lv * 2 / 10)) + 40 * status_get_lv(src) );
|
||||
} else {
|
||||
atk += ( ((int64)status_get_sp(src) * (1 + skill_lv * 2 / 10)) + 10 * status_get_lv(src) );
|
||||
}
|
||||
if(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE)
|
||||
atk += ( ((int64)status_get_max_sp(src) * (1 + skill_lv * 2 / 10)) + 40 * status_get_lv(src) );
|
||||
else
|
||||
atk += ( ((int64)status_get_sp(src) * (1 + skill_lv * 2 / 10)) + 10 * status_get_lv(src) );
|
||||
break;
|
||||
case SR_TIGERCANNON: // (Tiger Cannon skill level x 240) + (Target Base Level x 40)
|
||||
atk = ( skill_lv * 240 + status_get_lv(target) * 40 );
|
||||
if( sc && sc->data[SC_COMBO]
|
||||
&& sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE ) // (Tiger Cannon skill level x 500) + (Target Base Level x 40)
|
||||
atk = ( skill_lv * 500 + status_get_lv(target) * 40 );
|
||||
if( sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE ) // (Tiger Cannon skill level x 500) + (Target Base Level x 40)
|
||||
atk = ( skill_lv * 500 + status_get_lv(target) * 40 );
|
||||
else
|
||||
atk = ( skill_lv * 240 + status_get_lv(target) * 40 );
|
||||
break;
|
||||
case SR_FALLENEMPIRE:// [(Target Size value + Skill Level - 1) x Caster STR] + [(Target current weight x Caster DEX / 120)]
|
||||
atk = ( ((tstatus->size+1)*2 + skill_lv - 1) * status_get_str(src));
|
||||
if( tsd && tsd->weight ){
|
||||
if( tsd && tsd->weight )
|
||||
atk += ( (tsd->weight/10) * status_get_dex(src) / 120 );
|
||||
}else{
|
||||
else
|
||||
atk += ( status_get_lv(target) * 50 ); //mobs
|
||||
}
|
||||
break;
|
||||
case KO_SETSUDAN:
|
||||
if( tsc && tsc->data[SC_SPIRIT] ){
|
||||
@ -5621,12 +5621,14 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
|
||||
case NJ_ZENYNAGE:
|
||||
case KO_MUCHANAGE:
|
||||
md.damage = skill_get_zeny(skill_id ,skill_lv);
|
||||
if (!md.damage) md.damage = 2;
|
||||
md.damage = rand()%md.damage + md.damage / (skill_id==NJ_ZENYNAGE?1:2) ;
|
||||
if (!md.damage) md.damage = (skill_id == NJ_ZENYNAGE ? 2 : 10);
|
||||
md.damage = rand()%md.damage + md.damage;
|
||||
if (is_boss(target))
|
||||
md.damage=md.damage / (skill_id==NJ_ZENYNAGE?3:2);
|
||||
else if (tsd) // need confirmation for KO_MUCHANAGE
|
||||
md.damage=md.damage/2;
|
||||
md.damage = md.damage / (skill_id == NJ_ZENYNAGE ? 3 : 2);
|
||||
else if (tsd)
|
||||
md.damage = md.damage / 2;
|
||||
if (skill_id == KO_MUCHANAGE && pc_checkskill(sd, NJ_TOBIDOUGU) < 1 )
|
||||
md.damage = md.damage / 2;
|
||||
break;
|
||||
#ifdef RENEWAL
|
||||
case NJ_ISSEN:
|
||||
@ -5702,7 +5704,7 @@ struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *
|
||||
case RK_DRAGONBREATH:
|
||||
md.damage = ((status_get_hp(src) / 50) + (status_get_max_sp(src) / 4)) * skill_lv;
|
||||
RE_LVL_MDMOD(150);
|
||||
if (sd) md.damage = (int64)md.damage * (100 + 5 * (pc_checkskill(sd,RK_DRAGONTRAINING) - 1)) / 100;
|
||||
if (sd) md.damage = (int64)md.damage * (95 + 5 * pc_checkskill(sd,RK_DRAGONTRAINING)) / 100;
|
||||
md.flag |= BF_LONG|BF_WEAPON;
|
||||
break;
|
||||
case RA_CLUSTERBOMB:
|
||||
|
@ -2554,11 +2554,11 @@ void clif_storagelist(struct map_session_data* sd, struct item* items, int items
|
||||
#if PACKETVER < 20071002
|
||||
const int se = 20; //entry size equip
|
||||
const int sidxe = 4; //start itemlist idx
|
||||
const int cmde = 0xa6;
|
||||
const int cmde = 0x2d1;
|
||||
#elif PACKETVER < 20100629
|
||||
const int se = 26;
|
||||
const int sidxe = 4;
|
||||
const int cmde = 0xa6;
|
||||
const int cmde = 0x2d1;
|
||||
#elif PACKETVER < 20120925
|
||||
const int se = 28;
|
||||
const int sidxe = 4;
|
||||
@ -13122,13 +13122,15 @@ void clif_account_name(struct map_session_data* sd, int account_id, const char*
|
||||
/// 01df <account id>.L
|
||||
void clif_parse_GMReqAccountName(int fd, struct map_session_data *sd)
|
||||
{
|
||||
char command[30];
|
||||
int account_id = RFIFOL(fd,packet_db[sd->packet_ver][RFIFOW(fd,0)].pos[0]);
|
||||
if (sd->bl.type&BL_PC) { // Only show for players
|
||||
char command[30];
|
||||
int account_id = RFIFOL(fd,packet_db[sd->packet_ver][RFIFOW(fd,0)].pos[0]);
|
||||
|
||||
//tmp get all display
|
||||
safesnprintf(command,sizeof(command),"%caccinfo %d", atcommand_symbol, account_id);
|
||||
is_atcommand(fd, sd, command, 1);
|
||||
//clif_account_name(sd, account_id, ""); //! TODO request to login-serv
|
||||
//tmp get all display
|
||||
safesnprintf(command,sizeof(command),"%caccinfo %d", atcommand_symbol, account_id);
|
||||
is_atcommand(fd, sd, command, 1);
|
||||
//clif_account_name(sd, account_id, ""); //! TODO request to login-serv
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -182,6 +182,9 @@ enum mechanic_item_list {
|
||||
ITEMID_INDIGO_PTS,
|
||||
ITEMID_YELLOW_WISH_PTS,
|
||||
ITEMID_LIME_GREEN_PTS,
|
||||
ITEMID_REPAIR_A = 12392,
|
||||
ITEMID_REPAIR_B,
|
||||
ITEMID_REPAIR_C,
|
||||
};
|
||||
|
||||
///Genetic
|
||||
|
16
src/map/pc.c
16
src/map/pc.c
@ -4070,7 +4070,7 @@ char pc_additem(struct map_session_data *sd,struct item *item,int amount,e_log_p
|
||||
sd->status.inventory[i].expire_time == 0 &&
|
||||
memcmp(&sd->status.inventory[i].card, &item->card, sizeof(item->card)) == 0 ) {
|
||||
if( amount > MAX_AMOUNT - sd->status.inventory[i].amount || ( id->stack.inventory && amount > id->stack.amount - sd->status.inventory[i].amount ) )
|
||||
return 5;
|
||||
return ADDITEM_OVERAMOUNT;
|
||||
sd->status.inventory[i].amount += amount;
|
||||
clif_additem(sd,i,amount,0);
|
||||
break;
|
||||
@ -4085,9 +4085,11 @@ char pc_additem(struct map_session_data *sd,struct item *item,int amount,e_log_p
|
||||
return ADDITEM_OVERITEM;
|
||||
|
||||
memcpy(&sd->status.inventory[i], item, sizeof(sd->status.inventory[0]));
|
||||
// clear equips field first, just in case
|
||||
// clear equip and favorite fields first, just in case
|
||||
if( item->equip )
|
||||
sd->status.inventory[i].equip = 0;
|
||||
if( item->favorite )
|
||||
sd->status.inventory[i].favorite = 0;
|
||||
|
||||
sd->status.inventory[i].amount = amount;
|
||||
sd->inventory_data[i] = id;
|
||||
@ -9606,17 +9608,17 @@ void pc_overheat(struct map_session_data *sd, int val) {
|
||||
bool pc_isautolooting(struct map_session_data *sd, int nameid)
|
||||
{
|
||||
uint8 i = 0;
|
||||
bool j = false;
|
||||
|
||||
if (!sd->state.autolooting && !sd->state.autolootingtype)
|
||||
if (sd->state.autoloottype && sd->state.autoloottype&(1<<itemdb_type(nameid)))
|
||||
return true;
|
||||
|
||||
if (!sd->state.autolooting)
|
||||
return false;
|
||||
|
||||
if (sd->state.autolooting)
|
||||
ARR_FIND(0, AUTOLOOTITEM_SIZE, i, sd->state.autolootid[i] == nameid);
|
||||
if (sd->state.autolootingtype && sd->state.autoloottype&(1<<itemdb_type(nameid)))
|
||||
j = true;
|
||||
|
||||
return (i != AUTOLOOTITEM_SIZE || j );
|
||||
return (i != AUTOLOOTITEM_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -200,7 +200,6 @@ struct map_session_data {
|
||||
unsigned short autolootid[AUTOLOOTITEM_SIZE]; // [Zephyrus]
|
||||
unsigned short autoloottype;
|
||||
unsigned int autolooting : 1; //performance-saver, autolooting state for @alootid
|
||||
unsigned int autolootingtype : 1; //performance-saver, autolooting state for @autoloottype
|
||||
unsigned short autobonus; //flag to indicate if an autobonus is activated. [Inkfish]
|
||||
struct guild *gmaster_flag;
|
||||
unsigned int prevend : 1;//used to flag wheather you've spent 40sp to open the vending or not.
|
||||
|
281
src/map/skill.c
281
src/map/skill.c
@ -2847,8 +2847,13 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
case WL_CHAINLIGHTNING_ATK:
|
||||
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,1,WL_CHAINLIGHTNING,-2,6);
|
||||
break;
|
||||
case LG_OVERBRAND:
|
||||
case LG_OVERBRAND_BRANDISH:
|
||||
dmg.amotion = status_get_amotion(src) * 2;
|
||||
break;
|
||||
case LG_OVERBRAND_PLUSATK:
|
||||
dmg.dmotion = clif_skill_damage(dsrc,bl,tick,status_get_amotion(src),dmg.dmotion,damage,dmg.div_,skill_id,-1,5);
|
||||
break;
|
||||
case EL_FIRE_BOMB:
|
||||
case EL_FIRE_BOMB_ATK:
|
||||
case EL_FIRE_WAVE:
|
||||
@ -2877,7 +2882,7 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,skill_id,-1,(flag&1)?8:5);
|
||||
break;
|
||||
case WM_SEVERE_RAINSTORM_MELEE:
|
||||
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_SEVERE_RAINSTORM,skill_lv,5);
|
||||
dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_SEVERE_RAINSTORM,-2,6);
|
||||
break;
|
||||
case WM_REVERBERATION_MELEE:
|
||||
case WM_REVERBERATION_MAGIC:
|
||||
@ -2948,7 +2953,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
case MG_FIREWALL:
|
||||
case PR_SANCTUARY:
|
||||
case SC_TRIANGLESHOT:
|
||||
case LG_OVERBRAND:
|
||||
case SR_KNUCKLEARROW:
|
||||
case GN_WALLOFTHORN:
|
||||
case EL_FIRE_MANTLE:
|
||||
@ -2965,15 +2969,9 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list *
|
||||
}
|
||||
//blown-specific handling
|
||||
switch( skill_id ) {
|
||||
case LG_OVERBRAND:
|
||||
if( skill_blown(dsrc,bl,dmg.blewcount,dir,0) ) {
|
||||
short dir_x, dir_y;
|
||||
dir_x = dirx[(dir+4)%8];
|
||||
dir_y = diry[(dir+4)%8];
|
||||
if( map_getcell(bl->m, bl->x+dir_x, bl->y+dir_y, CELL_CHKNOPASS) != 0 )
|
||||
skill_addtimerskill(src, tick + status_get_amotion(src), bl->id, 0, 0, LG_OVERBRAND_PLUSATK, skill_lv, BF_WEAPON, flag );
|
||||
} else
|
||||
skill_addtimerskill(src, tick + status_get_amotion(src), bl->id, 0, 0, LG_OVERBRAND_PLUSATK, skill_lv, BF_WEAPON, flag );
|
||||
case LG_OVERBRAND_BRANDISH:
|
||||
if( skill_blown(dsrc,bl,dmg.blewcount,dir,0) < 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( skill_blown(dsrc,bl,dmg.blewcount,dir,0) && !(flag&4) ) {
|
||||
@ -3187,6 +3185,8 @@ static int skill_check_unit_range_sub (struct block_list *bl, va_list ap)
|
||||
case RA_ICEBOUNDTRAP:
|
||||
case SC_DIMENSIONDOOR:
|
||||
case SC_BLOODYLUST:
|
||||
case GN_THORNS_TRAP:
|
||||
case GN_HELLS_PLANT:
|
||||
case RL_B_TRAP:
|
||||
//Non stackable on themselves and traps (including venom dust which does not has the trap inf2 set)
|
||||
if (skill_id != g_skill_id && !(skill_get_inf2(g_skill_id)&INF2_TRAP) && g_skill_id != AS_VENOMDUST && g_skill_id != MH_POISON_MIST)
|
||||
@ -3606,8 +3606,6 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case LG_OVERBRAND_BRANDISH:
|
||||
case LG_OVERBRAND_PLUSATK:
|
||||
case SR_KNUCKLEARROW:
|
||||
skill_attack(BF_WEAPON, src, src, target, skl->skill_id, skl->skill_lv, tick, skl->flag|SD_LEVEL);
|
||||
break;
|
||||
@ -3677,7 +3675,17 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data)
|
||||
case WL_EARTHSTRAIN:
|
||||
skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,(skl->type<<16)|skl->flag);
|
||||
break;
|
||||
|
||||
case LG_OVERBRAND_BRANDISH: {
|
||||
short x2 = src->x, y2 = src->y, x = x2, y = y2;
|
||||
switch(skl->type) {
|
||||
case 0: case 1: case 7: x2 += 4; x -= 4; y2 += 4; break;
|
||||
case 3: case 4: case 5: x2 += 4; x -= 4; y -= 4; break;
|
||||
case 2: y2 += 4; y -= 4; x -= 4; break;
|
||||
case 6: y2 += 4; y -= 4; x2 += 4; break;
|
||||
}
|
||||
map_foreachinarea(skill_area_sub, src->m, x, y, x2, y2, BL_CHAR, src, skl->skill_id, skl->skill_lv, tick, skl->flag|BCT_ENEMY|SD_ANIMATION|1, skill_castend_damage_id);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (0);
|
||||
@ -3947,6 +3955,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
case LG_RAGEBURST:
|
||||
case LG_RAYOFGENESIS:
|
||||
case LG_HESPERUSLIT:
|
||||
case LG_OVERBRAND:
|
||||
case LG_OVERBRAND_BRANDISH:
|
||||
case SR_FALLENEMPIRE:
|
||||
case SR_CRESCENTELBOW_AUTOSPELL:
|
||||
case SR_GATEOFHELL:
|
||||
@ -4635,6 +4645,14 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
skill_castend_damage_id(src,bl,KN_SPEARBOOMERANG,skill_req,tick,0);
|
||||
}
|
||||
break;
|
||||
case RK_PHANTOMTHRUST:
|
||||
unit_setdir(src,map_calc_dir(src, bl->x, bl->y));
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
|
||||
skill_blown(src,bl,distance_bl(src,bl)-1,unit_getdir(src),0);
|
||||
if( battle_check_target(src,bl,BCT_ENEMY) > 0 )
|
||||
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
||||
break;
|
||||
case RK_CRUSHSTRIKE:
|
||||
if( sd ) {
|
||||
if( pc_checkskill(sd,RK_RUNEMASTERY) >= ( skill_id == RK_CRUSHSTRIKE ? 7 : 3 ) )
|
||||
@ -4966,13 +4984,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
|
||||
skill_attack((flag&1)?BF_WEAPON:BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag);
|
||||
break;
|
||||
|
||||
case LG_OVERBRAND:
|
||||
skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag|SD_LEVEL);
|
||||
break;
|
||||
|
||||
case LG_OVERBRAND_BRANDISH:
|
||||
skill_addtimerskill(src, tick + status_get_amotion(src)*8/10, bl->id, 0, 0, skill_id, skill_lv, BF_WEAPON, flag|SD_LEVEL);
|
||||
break;
|
||||
case SR_DRAGONCOMBO:
|
||||
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
||||
break;
|
||||
@ -5589,7 +5600,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
break;
|
||||
case SA_SUMMONMONSTER:
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
if (sd) mob_once_spawn(sd, src->m, src->x, src->y," --ja--", -1, 1, "", SZ_SMALL, AI_NONE);
|
||||
if (sd) mob_once_spawn(sd, src->m, src->x, src->y,"--ja--", -1, 1, "", SZ_SMALL, AI_NONE);
|
||||
break;
|
||||
case SA_LEVELUP:
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
@ -7042,7 +7053,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case SC_REBOUND: case SC_TELEKINESIS_INTENSE:
|
||||
case SC_HEAT_BARREL: case SC_HEAT_BARREL_AFTER: case SC_P_ALTER:
|
||||
case SC_E_CHAIN: case SC_C_MARKER: case SC_B_TRAP:
|
||||
case SC_H_MINE:
|
||||
case SC_H_MINE: case SC_RECOGNIZEDSPELL:
|
||||
case SC_MTF_ASPD: case SC_MTF_RANGEATK: case SC_MTF_MATK:
|
||||
case SC_MTF_MLEATKED: case SC_MTF_CRIDAMAGE: case SC_GN_CARTBOOST:
|
||||
#ifdef RENEWAL
|
||||
@ -8285,14 +8296,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
}
|
||||
break;
|
||||
|
||||
case RK_PHANTOMTHRUST:
|
||||
unit_setdir(src,map_calc_dir(src, bl->x, bl->y));
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
|
||||
skill_blown(src,bl,distance_bl(src,bl)-1,unit_getdir(src),0);
|
||||
if( battle_check_target(src,bl,BCT_ENEMY)>0 )
|
||||
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
||||
break;
|
||||
/**
|
||||
* Guilotine Cross
|
||||
**/
|
||||
@ -8542,7 +8545,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case SC_FULL_THROTTLE: case SC_REBOUND: case SC_TELEKINESIS_INTENSE:
|
||||
case SC_HEAT_BARREL: case SC_HEAT_BARREL_AFTER: case SC_P_ALTER:
|
||||
case SC_E_CHAIN: case SC_C_MARKER: case SC_B_TRAP:
|
||||
case SC_H_MINE:
|
||||
case SC_H_MINE: case SC_RECOGNIZEDSPELL:
|
||||
case SC_MTF_ASPD: case SC_MTF_RANGEATK: case SC_MTF_MATK:
|
||||
case SC_MTF_MLEATKED: case SC_MTF_CRIDAMAGE: case SC_GN_CARTBOOST:
|
||||
#ifdef RENEWAL
|
||||
@ -8839,18 +8842,21 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
break;
|
||||
|
||||
case NC_REPAIR:
|
||||
if( sd )
|
||||
{
|
||||
int heal = (skill_lv == 5 ? 23 : skill_lv == 4 ? 17 : skill_lv == 3 ? 13:skill_lv == 2 ? 7 : 4) / 100;
|
||||
if( dstsd && pc_ismadogear(dstsd) ) {
|
||||
heal *= dstsd->status.max_hp;
|
||||
status_heal(bl,heal,0,2);
|
||||
} else {
|
||||
heal *= sd->status.max_hp;
|
||||
status_heal(src,heal,0,2);
|
||||
if( sd ) {
|
||||
int heal, hp = 0;
|
||||
if( !dstsd || !pc_ismadogear(dstsd) ) {
|
||||
clif_skill_fail(sd, skill_id, USESKILL_FAIL_TOTARGET, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
clif_skill_damage(src, src, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6);
|
||||
switch(skill_lv) {
|
||||
case 1: hp = 4; break;
|
||||
case 2: hp = 7; break;
|
||||
case 3: hp = 13; break;
|
||||
case 4: hp = 17; break;
|
||||
case 5: default: hp = 23; break;
|
||||
}
|
||||
heal = dstsd->status.max_hp * hp / 100;
|
||||
status_heal(bl,heal,0,2);
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv, heal);
|
||||
}
|
||||
break;
|
||||
@ -8889,15 +8895,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
|
||||
case SC_BODYPAINT:
|
||||
if( flag&1 ) {
|
||||
if( tsc && (tsc->data[SC_HIDING] || tsc->data[SC_CLOAKING] ||
|
||||
tsc->data[SC_CHASEWALK] || tsc->data[SC_CLOAKINGEXCEED] ||
|
||||
tsc->data[SC__INVISIBILITY]) ) {
|
||||
if( tsc && (tsc->data[SC_HIDING] || tsc->data[SC_CLOAKING] || tsc->data[SC_CLOAKINGEXCEED]) ) {
|
||||
status_change_end(bl, SC_HIDING, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CLOAKING, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CHASEWALK, INVALID_TIMER);
|
||||
status_change_end(bl, SC_CLOAKINGEXCEED, INVALID_TIMER);
|
||||
status_change_end(bl, SC__INVISIBILITY, INVALID_TIMER);
|
||||
|
||||
sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv));
|
||||
sc_start(src,bl,SC_BLIND,53 + 2 * skill_lv,skill_lv,skill_get_time(skill_id,skill_lv));
|
||||
}
|
||||
@ -9149,7 +9150,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
break;
|
||||
}
|
||||
|
||||
heal = (120 * skill_lv) + (status_get_max_hp(bl) * (skill_lv / 100));
|
||||
heal = (120 * skill_lv) + (status_get_max_hp(bl) * skill_lv / 100);
|
||||
status_heal(bl, heal, 0, 0);
|
||||
|
||||
if( (tsc && tsc->opt1) && (rnd()%100 < ((skill_lv * 5) + (status_get_dex(src) + status_get_lv(src)) / 4) - (1 + (rnd() % 10))) ) {
|
||||
@ -10154,6 +10155,10 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
|
||||
if( !map_flag_vs(src->m) && battle_check_target(src,target,BCT_PARTY) <= 0 )
|
||||
break; // You can use Clearance on party members in normal maps too. [pakpil]
|
||||
}
|
||||
else if( sd && (inf2&INF2_CHORUS_SKILL) && skill_check_pc_partner(sd, ud->skill_id, &ud->skill_lv, 1, 0) < 1 ) {
|
||||
clif_skill_fail(sd, ud->skill_id, USESKILL_FAIL_NEED_HELPER, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
if(inf&BCT_ENEMY && (sc = status_get_sc(target)) &&
|
||||
sc->data[SC_FOGWALL] &&
|
||||
@ -10678,13 +10683,14 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
||||
case SC_MAELSTROM:
|
||||
case SC_BLOODYLUST:
|
||||
case WM_REVERBERATION:
|
||||
case WM_SEVERE_RAINSTORM:
|
||||
case WM_POEMOFNETHERWORLD:
|
||||
case SO_PSYCHIC_WAVE:
|
||||
case SO_VACUUM_EXTREME:
|
||||
case GN_WALLOFTHORN:
|
||||
case GN_THORNS_TRAP:
|
||||
case GN_DEMONIC_FIRE:
|
||||
case GN_FIRE_EXPANSION_SMOKE_POWDER:
|
||||
case GN_FIRE_EXPANSION_TEAR_GAS:
|
||||
case GN_HELLS_PLANT:
|
||||
case SO_EARTHGRAVE:
|
||||
case SO_DIAMONDDUST:
|
||||
@ -11060,14 +11066,13 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
||||
struct mob_data *md;
|
||||
|
||||
md = mob_once_spawn_sub(src, src->m, x, y, status_get_name(src), class_, "", SZ_SMALL, AI_NONE);
|
||||
if( md )
|
||||
{
|
||||
if( md ) {
|
||||
md->master_id = src->id;
|
||||
md->special_state.ai = AI_FAW;
|
||||
if( md->deletetimer != INVALID_TIMER )
|
||||
delete_timer(md->deletetimer, mob_timer_delete);
|
||||
md->deletetimer = add_timer (gettick() + skill_get_time(skill_id, skill_lv), mob_timer_delete, md->bl.id, 0);
|
||||
mob_spawn( md );
|
||||
mob_spawn(md);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -11089,8 +11094,18 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
||||
skill_addtimerskill(src,tick,src->id,0,0,skill_id,skill_lv,0,0);
|
||||
break;
|
||||
|
||||
case LG_OVERBRAND:
|
||||
skill_overbrand(src, skill_id, skill_lv, x, y, tick, flag);
|
||||
case LG_OVERBRAND: {
|
||||
uint8 dir = map_calc_dir(src, x, y);
|
||||
uint8 x2 = x = src->x, y2 = y = src->y;
|
||||
switch(dir) {
|
||||
case 0: case 1: case 7: x2++; x--; y2 += 7; break;
|
||||
case 3: case 4: case 5: x2++; x--; y -= 7; break;
|
||||
case 2: y2++; y--; x -= 7; break;
|
||||
case 6: y2++; y--; x2 += 7; break;
|
||||
}
|
||||
map_foreachinarea(skill_area_sub, src->m, x, y, x2, y2, BL_CHAR, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_ANIMATION|1, skill_castend_damage_id);
|
||||
skill_addtimerskill(src, gettick() + status_get_amotion(src), 0, 0, 0, LG_OVERBRAND_BRANDISH, skill_lv, dir, flag);
|
||||
}
|
||||
break;
|
||||
|
||||
case LG_BANDING:
|
||||
@ -11122,6 +11137,14 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
||||
flag|=1; // Should counsume 1 item per skill usage.
|
||||
map_foreachinrange(skill_area_sub, src, skill_get_splash(skill_id,skill_lv),splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY, skill_castend_damage_id);
|
||||
break;
|
||||
|
||||
case WM_SEVERE_RAINSTORM:
|
||||
flag |= 1;
|
||||
if (sd)
|
||||
sd->canequip_tick = tick + skill_get_time(skill_id, skill_lv); // Can't switch equips for the duration of the skill.
|
||||
skill_unitsetting(src,skill_id,skill_lv,x,y,0);
|
||||
break;
|
||||
|
||||
case GN_CRAZYWEED: {
|
||||
int area = skill_get_splash(GN_CRAZYWEED_ATK, skill_lv);
|
||||
for( i = 0; i < 3 + (skill_lv/2); i++ ) {
|
||||
@ -11149,12 +11172,16 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
||||
ud->skillunit[i]->unit_id = UNT_FIRE_EXPANSION_TEAR_GAS;
|
||||
clif_changetraplook(&ud->skillunit[i]->unit->bl, UNT_FIRE_EXPANSION_TEAR_GAS);
|
||||
break;
|
||||
case 5:
|
||||
case 5: {
|
||||
int acid_lv = 5; // Cast at Acid Demonstration at level 5 unless the user has a higher level learned.
|
||||
if( sd && pc_checkskill(sd, CR_ACIDDEMONSTRATION) > 5 )
|
||||
acid_lv = pc_checkskill(sd, CR_ACIDDEMONSTRATION);
|
||||
map_foreachinarea(skill_area_sub, src->m,
|
||||
ud->skillunit[i]->unit->bl.x - 3, ud->skillunit[i]->unit->bl.y - 3,
|
||||
ud->skillunit[i]->unit->bl.x + 3, ud->skillunit[i]->unit->bl.y + 3, BL_CHAR,
|
||||
src, CR_ACIDDEMONSTRATION, ((sd) ? pc_checkskill(sd, CR_ACIDDEMONSTRATION) : skill_get_max(CR_ACIDDEMONSTRATION)), tick, flag|BCT_ENEMY|1|SD_LEVEL, skill_castend_damage_id);
|
||||
src, CR_ACIDDEMONSTRATION, acid_lv, tick, flag|BCT_ENEMY|1|SD_LEVEL, skill_castend_damage_id);
|
||||
skill_delunit(ud->skillunit[i]->unit);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ud->skillunit[i]->unit->val2 = skill_lv;
|
||||
@ -11568,6 +11595,8 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill
|
||||
case WZ_QUAGMIRE: //The target changes to "all" if used in a gvg map. [Skotlex]
|
||||
case AM_DEMONSTRATION:
|
||||
case GN_HELLS_PLANT:
|
||||
if( skill_id == GN_HELLS_PLANT && map_getcell(src->m, x, y, CELL_CHKLANDPROTECTOR) )
|
||||
return NULL;
|
||||
if (map_flag_vs(src->m) && battle_config.vs_traps_bctall
|
||||
&& (src->type&battle_config.vs_traps_bctall))
|
||||
target = BCT_ALL;
|
||||
@ -11791,9 +11820,6 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill
|
||||
case SO_WARMER:
|
||||
skill_clear_group(src, 8);
|
||||
break;
|
||||
case SO_VACUUM_EXTREME:
|
||||
range++;
|
||||
break;
|
||||
case GN_WALLOFTHORN:
|
||||
if( flag&1 )
|
||||
limit = 3000;
|
||||
@ -12005,6 +12031,9 @@ static int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, un
|
||||
if (sc && sc->option&OPTION_HIDE && sg->skill_id != WZ_HEAVENDRIVE && sg->skill_id != WL_EARTHSTRAIN)
|
||||
return 0; //Hidden characters are immune to AoE skills except to these. [Skotlex]
|
||||
|
||||
if (sc && sc->data[SC_VACUUM_EXTREME] && map_getcell(bl->m, bl->x, bl->y, CELL_CHKLANDPROTECTOR))
|
||||
status_change_end(bl, SC_VACUUM_EXTREME, INVALID_TIMER);
|
||||
|
||||
if (sc && sc->data[SC_HOVERING] && skill_get_inf3(sg->skill_id)&INF3_NO_EFF_HOVERING)
|
||||
return 0; // Under Hovering characters are immune to trap and ground target skills.
|
||||
|
||||
@ -12673,14 +12702,15 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
||||
}
|
||||
hp = tstatus->max_hp * hp / 100;
|
||||
sp = tstatus->max_sp * sp / 100;
|
||||
status_heal(bl, hp, sp, 2);
|
||||
status_heal(bl, hp, sp, 3);
|
||||
sc_start(ss, bl, type, 100, sg->skill_lv, (sg->interval * 3) + 100);
|
||||
}
|
||||
// Reveal hidden players every 5 seconds.
|
||||
if( sg->val2 % 5 == 0 ) {
|
||||
// TODO: check if other hidden status can be removed.
|
||||
// Doesn't remove Invisibility or Chase Walk.
|
||||
status_change_end(bl,SC_HIDING,INVALID_TIMER);
|
||||
status_change_end(bl,SC_CLOAKING,INVALID_TIMER);
|
||||
status_change_end(bl,SC_CLOAKINGEXCEED,INVALID_TIMER);
|
||||
}
|
||||
}
|
||||
/* Enable this if kRO fix the current skill. Currently no damage on undead and demon monster. [Jobbie]
|
||||
@ -12714,12 +12744,9 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
||||
skill_attack(BF_WEAPON,ss,&src->bl,bl,WM_SEVERE_RAINSTORM_MELEE,sg->skill_lv,tick,0);
|
||||
break;
|
||||
case UNT_NETHERWORLD:
|
||||
if( !(status_get_mode(bl)&MD_BOSS) && ss != bl && battle_check_target(&src->bl, bl, BCT_NOPARTY) > 0 ) {
|
||||
if( !(tsc && tsc->data[type]) ){
|
||||
if( !(status_get_mode(bl)&MD_BOSS) ) {
|
||||
if( !(tsc && tsc->data[type]) )
|
||||
sc_start(ss, bl, type, 100, sg->skill_lv, skill_get_time2(sg->skill_id,sg->skill_lv));
|
||||
sg->limit = DIFF_TICK(tick,sg->tick);
|
||||
sg->unit_id = UNT_USED_TRAPS;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case UNT_THORNS_TRAP:
|
||||
@ -12751,7 +12778,7 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
||||
skill_attack(skill_get_type(sg->skill_id), ss, &src->bl, bl, sg->skill_id, sg->skill_lv + 10 * sg->val2, tick, 0);
|
||||
break;
|
||||
case 3:
|
||||
skill_attack(skill_get_type(CR_ACIDDEMONSTRATION), ss, &src->bl, bl, CR_ACIDDEMONSTRATION, ((sd) ? pc_checkskill(sd, CR_ACIDDEMONSTRATION) : skill_get_max(CR_ACIDDEMONSTRATION)), tick, 0);
|
||||
skill_attack(skill_get_type(CR_ACIDDEMONSTRATION), ss, &src->bl, bl, CR_ACIDDEMONSTRATION, ((sd) ? pc_checkskill(sd, CR_ACIDDEMONSTRATION) : sg->skill_lv), tick, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -12768,8 +12795,8 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
||||
case UNT_HELLS_PLANT:
|
||||
if( battle_check_target(&src->bl,bl,BCT_ENEMY) > 0 )
|
||||
skill_attack(skill_get_type(GN_HELLS_PLANT_ATK), ss, &src->bl, bl, GN_HELLS_PLANT_ATK, sg->skill_lv, tick, 0);
|
||||
if( ss != bl) //The caster is the only one who can step on the Plants, without destroying them
|
||||
skill_delunit(sg->unit); // deleting it directly to avoid extra hits
|
||||
if( ss != bl) // The caster is the only one who can step on the Plants without destroying them
|
||||
sg->limit = DIFF_TICK(tick, sg->tick) + 100;
|
||||
break;
|
||||
|
||||
case UNT_CLOUD_KILL:
|
||||
@ -12818,34 +12845,11 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
|
||||
break;
|
||||
|
||||
case UNT_VACUUM_EXTREME:
|
||||
{
|
||||
int sec = sg->limit - DIFF_TICK(tick, sg->tick);
|
||||
int range = skill_get_unit_range(sg->skill_id, sg->skill_lv);
|
||||
|
||||
if( tsc && tsc->data[SC_HALLUCINATIONWALK] ) // Don't affect the target if Hallucination Walk is active
|
||||
break;
|
||||
|
||||
if( tsc && !tsc->data[type] &&
|
||||
distance_xy(src->bl.x, src->bl.y, bl->x, bl->y) <= range) // Don't consider outer boundaries
|
||||
sc_start(ss, bl, type, 100, sg->skill_lv, sec);
|
||||
|
||||
if( unit_is_walking(bl) && // Wait until the target has stopped walking
|
||||
( tsc && tsc->data[type] && tsc->data[type]->val4 >= tsc->data[type]->val3-range ))
|
||||
break;
|
||||
|
||||
if( tsc && ( !tsc->data[type] || (tsc->data[type] && tsc->data[type]->val4 < 1 ) ) )
|
||||
break;
|
||||
|
||||
if( unit_is_walking(bl) &&
|
||||
distance_xy(src->bl.x, src->bl.y, bl->x, bl->y) > range ) // Going outside of boundary? Then force target to stop
|
||||
unit_stop_walking(bl,1);
|
||||
|
||||
if( !unit_is_walking(bl) &&
|
||||
distance_xy(src->bl.x, src->bl.y, bl->x, bl->y) <= range && // Only snap if the target is inside the range or
|
||||
src->bl.x != bl->x && src->bl.y != bl->y) { // at a diagonal position parallel to Vacuum Extreme's center
|
||||
unit_movepos(bl, src->bl.x, src->bl.y, 0, 0);
|
||||
clif_fixpos(bl);
|
||||
}
|
||||
if ( tsc && tsc->data[SC_HALLUCINATIONWALK] )
|
||||
return 0;
|
||||
else {
|
||||
sg->limit -= 100 * tstatus->str/20;
|
||||
sc_start(ss, bl, SC_VACUUM_EXTREME, 100, sg->skill_lv, sg->limit);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -13372,7 +13376,7 @@ static int skill_check_condition_mob_master_sub (struct block_list *bl, va_list
|
||||
skill=va_arg(ap,int);
|
||||
c=va_arg(ap,int *);
|
||||
|
||||
ai = (unsigned)(skill == AM_SPHEREMINE?2:skill == KO_ZANZOU?4:skill == MH_SUMMON_LEGION?5:3);
|
||||
ai = (unsigned)(skill == AM_SPHEREMINE?AI_SPHERE:skill == KO_ZANZOU?AI_ZANZOU:skill == MH_SUMMON_LEGION?AI_LEGION:skill == NC_SILVERSNIPER?AI_FAW:skill == NC_MAGICDECOY?AI_FAW:AI_FLORA);
|
||||
if( md->master_id != src_id || md->special_state.ai != ai)
|
||||
return 0; //Non alchemist summoned mobs have nothing to do here.
|
||||
|
||||
@ -14736,6 +14740,22 @@ struct skill_condition skill_get_requirement(struct map_session_data* sd, uint16
|
||||
req.amount[skill_lv-1] = skill_db[idx].require.amount[skill_lv-1];
|
||||
break;
|
||||
}
|
||||
if (skill_id == NC_REPAIR) {
|
||||
switch(skill_lv) {
|
||||
case 1:
|
||||
case 2:
|
||||
req.itemid[1] = ITEMID_REPAIR_A;
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
req.itemid[1] = ITEMID_REPAIR_B;
|
||||
break;
|
||||
case 5:
|
||||
req.itemid[1] = ITEMID_REPAIR_C;
|
||||
break;
|
||||
}
|
||||
req.amount[1] = 1;
|
||||
}
|
||||
|
||||
// Check for cost reductions due to skills & SCs
|
||||
switch(skill_id) {
|
||||
@ -15137,45 +15157,6 @@ int skill_delayfix (struct block_list *bl, uint16 skill_id, uint16 skill_lv)
|
||||
/*=========================================
|
||||
*
|
||||
*-----------------------------------------*/
|
||||
void skill_overbrand(struct block_list* src, uint16 skill_id, uint16 skill_lv, uint16 x, uint16 y, unsigned int tick, int flag)
|
||||
{
|
||||
struct s_skill_unit_layout *layout;
|
||||
int i, ux[53], uy[53]; //Number of cells we are attacking
|
||||
short dir = map_calc_dir(src,x,y);
|
||||
layout = skill_get_unit_layout(skill_id,skill_lv,src,x,y);
|
||||
if(dir > 0 && dir < 4) { //Need to invert the cell locations for directions
|
||||
for(i = 0; i < 53; i++) {
|
||||
ux[i] = layout->dy[i];
|
||||
uy[i] = layout->dx[i] * -1;
|
||||
}
|
||||
} else if(dir == 4) {
|
||||
for(i = 0; i < 53; i++) {
|
||||
ux[i] = layout->dx[i];
|
||||
uy[i] = layout->dy[i];
|
||||
}
|
||||
} else if(dir > 4) {
|
||||
for(i = 0; i < 53; i++) {
|
||||
ux[i] = layout->dy[i] * -1;
|
||||
uy[i] = layout->dx[i];
|
||||
}
|
||||
} else {
|
||||
for(i = 0; i < 53; i++) {
|
||||
ux[i] = layout->dx[i];
|
||||
uy[i] = layout->dy[i] * -1;
|
||||
}
|
||||
}
|
||||
for( i = 0; i < 53; i++ ) {
|
||||
if(i < 12) { //Close range hits twice
|
||||
map_foreachincell(skill_area_sub, src->m, x+ux[i], y+uy[i], splash_target(src), src, LG_OVERBRAND_BRANDISH, skill_lv, tick, flag|BCT_ENEMY,skill_castend_damage_id);
|
||||
map_foreachincell(skill_area_sub, src->m, x+ux[i], y+uy[i], splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY,skill_castend_damage_id);
|
||||
} else if(i > 11 && i < 45) //Far sides do knockback damage
|
||||
map_foreachincell(skill_area_sub, src->m, x+ux[i], y+uy[i], splash_target(src), src, skill_id, skill_lv, tick, flag|BCT_ENEMY,skill_castend_damage_id);
|
||||
else //Far middle does piercing damage
|
||||
map_foreachincell(skill_area_sub, src->m, x+ux[i], y+uy[i], splash_target(src), src, LG_OVERBRAND_BRANDISH, skill_lv, tick, flag|BCT_ENEMY,skill_castend_damage_id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
struct square {
|
||||
int val1[5];
|
||||
int val2[5];
|
||||
@ -15775,6 +15756,10 @@ int skill_clear_group (struct block_list *bl, int flag)
|
||||
if (flag&1)
|
||||
group[count++]= ud->skillunit[i];
|
||||
break;
|
||||
case SO_CLOUD_KILL:
|
||||
if( flag&4 )
|
||||
group[count++]= ud->skillunit[i];
|
||||
break;
|
||||
case SO_WARMER:
|
||||
if( flag&8 )
|
||||
group[count++]= ud->skillunit[i];
|
||||
@ -15808,6 +15793,7 @@ struct skill_unit_group *skill_locate_element_field(struct block_list *bl)
|
||||
case SA_VIOLENTGALE:
|
||||
case SA_LANDPROTECTOR:
|
||||
case NJ_SUITON:
|
||||
case SO_CLOUD_KILL:
|
||||
case SO_WARMER:
|
||||
return ud->skillunit[i];
|
||||
}
|
||||
@ -16122,7 +16108,7 @@ int skill_maelstrom_suction(struct block_list *bl, va_list ap)
|
||||
int skill_enchant_elemental_end (struct block_list *bl, int type)
|
||||
{
|
||||
struct status_change *sc;
|
||||
const enum sc_type scs[] = { SC_ENCPOISON, SC_ASPERSIO, SC_FIREWEAPON, SC_WATERWEAPON, SC_WINDWEAPON, SC_EARTHWEAPON, SC_SHADOWWEAPON, SC_GHOSTWEAPON, SC_ENCHANTARMS, SC_EXEEDBREAK };
|
||||
const enum sc_type scs[] = { SC_ENCPOISON, SC_ASPERSIO, SC_FIREWEAPON, SC_WATERWEAPON, SC_WINDWEAPON, SC_EARTHWEAPON, SC_SHADOWWEAPON, SC_GHOSTWEAPON, SC_ENCHANTARMS };
|
||||
int i;
|
||||
nullpo_ret(bl);
|
||||
nullpo_ret(sc= status_get_sc(bl));
|
||||
@ -17904,6 +17890,7 @@ int skill_magicdecoy(struct map_session_data *sd, int nameid) {
|
||||
x = sd->sc.comet_x;
|
||||
y = sd->sc.comet_y;
|
||||
sd->sc.comet_x = sd->sc.comet_y = 0;
|
||||
sd->menuskill_val = 0;
|
||||
|
||||
// Item picked decides the mob class
|
||||
switch(nameid) {
|
||||
@ -18548,18 +18535,6 @@ void skill_init_unit_layout (void) {
|
||||
memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
|
||||
}
|
||||
break;
|
||||
case LG_OVERBRAND: {
|
||||
static const int dx[] = {-1,-1,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1,
|
||||
-5,-5,-5,-5,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-2,-2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5,
|
||||
-1,-1,-1, 0, 0, 0, 1, 1, 1};
|
||||
static const int dy[] = { 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3,
|
||||
0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3,
|
||||
-4,-5,-6,-4,-5,-6,-4,-5,-6};
|
||||
skill_unit_layout[pos].count = 53;
|
||||
memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
|
||||
memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ShowError("unknown unit layout at skill %d\n",i);
|
||||
break;
|
||||
@ -18676,7 +18651,7 @@ int skill_block_check(struct block_list *bl, sc_type type , uint16 skill_id) {
|
||||
switch(type){
|
||||
case SC_STASIS:
|
||||
inf = skill_get_inf2(skill_id);
|
||||
if( inf == INF2_SONG_DANCE || /*skill_get_inf2(skill_id) == INF2_CHORUS_SKILL ||*/ inf == INF2_SPIRIT_SKILL )
|
||||
if( inf == INF2_SONG_DANCE || skill_get_inf2(skill_id) == INF2_CHORUS_SKILL || inf == INF2_SPIRIT_SKILL )
|
||||
return 1; // Can't do it.
|
||||
if( inf3&INF3_STATIS_BL)
|
||||
return 1;
|
||||
|
@ -2373,7 +2373,7 @@ int status_calc_mob_(struct mob_data* md, bool first)
|
||||
if(!mstatus)
|
||||
break;
|
||||
status->max_hp = (1000 * ud->skill_lv) + (mstatus->hp / 3) + (status_get_lv(mbl) * 12);
|
||||
status->batk = (((ud->skill_lv > 3)?300:100) + (200 * ud->skill_lv));
|
||||
status->batk = 200 * ud->skill_lv;
|
||||
break;
|
||||
}
|
||||
case NC_MAGICDECOY:
|
||||
@ -2381,7 +2381,7 @@ int status_calc_mob_(struct mob_data* md, bool first)
|
||||
struct status_data *mstatus = status_get_status_data(mbl);
|
||||
if(!mstatus)
|
||||
break;
|
||||
status->max_hp = (1000 * ((TBL_PC*)mbl)->menuskill_val) + (mstatus->hp * 4) + (status_get_lv(mbl) * 12);
|
||||
status->max_hp = (1000 * ((TBL_PC*)mbl)->menuskill_val) + (mstatus->sp * 4) + (status_get_lv(mbl) * 12);
|
||||
status->matk_min = status->matk_max = 250 + 50*((TBL_PC*)mbl)->menuskill_val;
|
||||
break;
|
||||
}
|
||||
@ -5260,7 +5260,7 @@ static unsigned short status_calc_matk(struct block_list *bl, struct status_chan
|
||||
if (sc->data[SC_INCMATKRATE])
|
||||
matk += matk * sc->data[SC_INCMATKRATE]->val1/100;
|
||||
if (sc->data[SC_MOONLITSERENADE])
|
||||
matk += matk * sc->data[SC_MOONLITSERENADE]->val3;
|
||||
matk += matk * sc->data[SC_MOONLITSERENADE]->val3/100;
|
||||
if (sc->data[SC_ZANGETSU])
|
||||
matk += matk * sc->data[SC_ZANGETSU]->val2 / 100;
|
||||
if (sc->data[SC_MTF_MATK])
|
||||
@ -5812,8 +5812,8 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha
|
||||
val = max( val, 50 );
|
||||
if( sc->data[SC_MARSHOFABYSS] )
|
||||
val = max( val, sc->data[SC_MARSHOFABYSS]->val3 );
|
||||
if( sc->data[SC_CAMOUFLAGE] )
|
||||
val = max( val, sc->data[SC_CAMOUFLAGE]->val1 < 3 ? 0 : 25 * sc->data[SC_CAMOUFLAGE]->val1 );
|
||||
if( sc->data[SC_CAMOUFLAGE] && (sc->data[SC_CAMOUFLAGE]->val3&1) == 0 )
|
||||
val = max( val, sc->data[SC_CAMOUFLAGE]->val1 < 3 ? 0 : 25 * (5 - sc->data[SC_CAMOUFLAGE]->val1) );
|
||||
if( sc->data[SC_STEALTHFIELD_MASTER] )
|
||||
val = max( val, 30 );
|
||||
if( sc->data[SC_BANDING_DEFENCE] )
|
||||
@ -7100,6 +7100,9 @@ int status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_typ
|
||||
case SC_CRYSTALIZE:
|
||||
tick_def2 = status->vit*100;
|
||||
break;
|
||||
case SC_VACUUM_EXTREME:
|
||||
tick_def2 = status->str*50;
|
||||
break;
|
||||
case SC_MANDRAGORA:
|
||||
sc_def = (status->vit + status->luk)*20;
|
||||
break;
|
||||
@ -7277,15 +7280,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
switch( type ) {
|
||||
case SC_DEEPSLEEP:
|
||||
case SC_BURNING:
|
||||
case SC_STUN:
|
||||
case SC_SLEEP:
|
||||
case SC_CURSE:
|
||||
case SC_STONE:
|
||||
case SC_POISON:
|
||||
case SC_BLIND:
|
||||
case SC_SILENCE:
|
||||
case SC_BLEEDING:
|
||||
case SC_FREEZE:
|
||||
case SC_FREEZING:
|
||||
case SC_CRYSTALIZE:
|
||||
case SC_TOXIN:
|
||||
@ -7304,22 +7298,27 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
if( type >= SC_COMMON_MIN && type <= SC_COMMON_MAX )
|
||||
return 0; // Immune to status ailements
|
||||
switch( type ) {
|
||||
case SC_DEEPSLEEP:
|
||||
case SC_SATURDAYNIGHTFEVER:
|
||||
case SC_PYREXIA:
|
||||
case SC_DEATHHURT:
|
||||
case SC_MAGICMUSHROOM:
|
||||
case SC_VENOMBLEED:
|
||||
case SC_BURNING:
|
||||
case SC_FREEZING:
|
||||
case SC_CRYSTALIZE:
|
||||
case SC_FEAR:
|
||||
case SC_TOXIN:
|
||||
case SC_PARALYSE:
|
||||
case SC_VENOMBLEED:
|
||||
case SC_MAGICMUSHROOM:
|
||||
case SC_DEATHHURT:
|
||||
case SC_PYREXIA:
|
||||
case SC_OBLIVIONCURSE:
|
||||
case SC_LEECHESEND:
|
||||
case SC_DEEPSLEEP:
|
||||
case SC_SATURDAYNIGHTFEVER:
|
||||
case SC__BODYPAINT:
|
||||
case SC__ENERVATION:
|
||||
case SC__GROOMY:
|
||||
case SC__IGNORANCE:
|
||||
case SC__LAZINESS:
|
||||
case SC__UNLUCKY:
|
||||
case SC__WEAKNESS:
|
||||
case SC__BODYPAINT:
|
||||
case SC__IGNORANCE:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -7341,6 +7340,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
|| (type==SC_ANGRIFFS_MODUS && sc->data[SC_GOLDENE_FERSE])
|
||||
)
|
||||
return 0;
|
||||
case SC_VACUUM_EXTREME:
|
||||
if(sc->data[SC_HALLUCINATIONWALK] || sc->data[SC_HOVERING])
|
||||
return 0;
|
||||
break;
|
||||
case SC_STONE:
|
||||
if(sc->data[SC_POWER_OF_GAIA])
|
||||
return 0;
|
||||
@ -8398,10 +8401,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
else
|
||||
val4 |= battle_config.monster_cloak_check_type&7;
|
||||
break;
|
||||
case SC_SIGHTBLASTER:
|
||||
tick = -1; // Duration sent to the client should be infinite
|
||||
case SC_SIGHT: /* splash status */
|
||||
case SC_RUWACH:
|
||||
case SC_SIGHTBLASTER:
|
||||
val3 = skill_get_splash(val2, val1); // Val2 should bring the skill-id.
|
||||
val2 = tick/250;
|
||||
tick_time = 10; // [GodLesZ] tick time
|
||||
@ -9145,8 +9147,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
tick_time = 2000; // [GodLesZ] tick time
|
||||
break;
|
||||
case SC_SIRCLEOFNATURE:
|
||||
val2 = 4 + val1; // SP consume
|
||||
val3 = 40 * val1; // HP recovery
|
||||
val2 = 40 + val1; // HP recovery
|
||||
val3 = 4 * val1; // SP consume
|
||||
val4 = tick / 1000;
|
||||
tick_time = 1000; // [GodLesZ] tick time
|
||||
break;
|
||||
@ -9221,12 +9223,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
break;
|
||||
case SC_EXEEDBREAK:
|
||||
val1 *= 100; // 100 * skill_lv
|
||||
if( sd && sd->inventory_data[sd->equip_index[EQI_HAND_R]] ) { // Chars.
|
||||
if( sd && sd->inventory_data[sd->equip_index[EQI_HAND_R]] ) {
|
||||
val1 += (sd->inventory_data[sd->equip_index[EQI_HAND_R]]->weight/10 * sd->inventory_data[sd->equip_index[EQI_HAND_R]]->wlv * status_get_lv(bl) / 100);
|
||||
val1 += 10 * sd->status.job_level;
|
||||
}
|
||||
else // Mobs
|
||||
val1 += 500;
|
||||
break;
|
||||
case SC_PRESTIGE:
|
||||
val2 = (status->int_ + status->luk) * (val1 / 20) * (status_get_lv(bl) / 200) + val1; // Chance to evade magic damage.
|
||||
@ -9726,6 +9726,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
|
||||
if (battle_config.sc_castcancel&bl->type)
|
||||
unit_skillcastcancel(bl, 0);
|
||||
break;
|
||||
case SC_VACUUM_EXTREME:
|
||||
if (!map_flag_gvg(bl->m))
|
||||
unit_stop_walking(bl, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
// Set option as needed.
|
||||
@ -10588,9 +10592,6 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SC_VACUUM_EXTREME:
|
||||
if(sc && sce->val2 && sc->cant.move > 0) sc->cant.move--;
|
||||
break;
|
||||
case SC_KYOUGAKU:
|
||||
clif_status_load(bl, SI_KYOUGAKU, 0); // Avoid client crash
|
||||
clif_status_load(bl, SI_ACTIVE_MONSTER_TRANSFORM, 0);
|
||||
@ -11324,7 +11325,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
|
||||
int heal = status->max_hp * 3 / 100;
|
||||
if( sc && sc->data[SC_AKAITSUKI] && heal )
|
||||
heal = ~heal + 1;
|
||||
status_heal(bl, heal, 0, 2);
|
||||
status_heal(bl, heal, 0, 3);
|
||||
sc_timer_next(5000 + tick, status_change_timer, bl->id, data);
|
||||
return 0;
|
||||
}
|
||||
@ -11423,16 +11424,6 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case SC_VACUUM_EXTREME:
|
||||
if( --(sce->val4) >= 0 ) {
|
||||
if( !unit_is_walking(bl) && !sce->val2 ) {
|
||||
sc->cant.move++;
|
||||
sce->val2 = 1;
|
||||
}
|
||||
sc_timer_next(100 + tick, status_change_timer, bl->id, data);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case SC_BLOODSUCKER:
|
||||
if( --(sce->val4) >= 0 ) {
|
||||
struct block_list *src = map_id2bl(sce->val2);
|
||||
|
@ -141,10 +141,10 @@ TBL_PC* unit_get_master(struct block_list *bl)
|
||||
{
|
||||
if(bl)
|
||||
switch(bl->type) {
|
||||
case BL_HOM : return (((TBL_HOM *)bl)->master);
|
||||
case BL_ELEM : return (((TBL_ELEM *)bl)->master);
|
||||
case BL_PET : return (((TBL_PET *)bl)->master);
|
||||
case BL_MER : return (((TBL_MER *)bl)->master);
|
||||
case BL_HOM: return (((TBL_HOM *)bl)->master);
|
||||
case BL_ELEM: return (((TBL_ELEM *)bl)->master);
|
||||
case BL_PET: return (((TBL_PET *)bl)->master);
|
||||
case BL_MER: return (((TBL_MER *)bl)->master);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@ -167,7 +167,7 @@ int* unit_get_masterteleport_timer(struct block_list *bl)
|
||||
}
|
||||
|
||||
/**
|
||||
* Warps a unit to its master master has gone out of site (3 second default) \n
|
||||
* Warps a unit to its master if the master has gone out of sight (3 second default)
|
||||
* Can be any object with a master [MOB|PET|HOM|MER|ELEM]
|
||||
* @param tid: Timer
|
||||
* @param tick: tick (unused)
|
||||
@ -197,23 +197,23 @@ int unit_teleport_timer(int tid, unsigned int tick, int id, intptr_t data)
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a slave unit is outside their max distance from master \n
|
||||
* If so, starts a timer for (default: 3 seconds) which will teleport the unit back to master
|
||||
* Checks if a slave unit is outside their max distance from master
|
||||
* If so, starts a timer (default: 3 seconds) which will teleport the unit back to master
|
||||
* @param sbl: Object with a master [MOB|PET|HOM|MER|ELEM]
|
||||
* @return 0
|
||||
*/
|
||||
int unit_check_start_teleport_timer(struct block_list *sbl)
|
||||
{
|
||||
TBL_PC *msd = unit_get_master(sbl);
|
||||
int max_dist=0;
|
||||
switch(sbl->type){
|
||||
case BL_HOM: max_dist = AREA_SIZE; break;
|
||||
case BL_ELEM: max_dist = MAX_ELEDISTANCE; break;
|
||||
case BL_PET : max_dist = AREA_SIZE; break;
|
||||
case BL_MER : max_dist = MAX_MER_DISTANCE; break;
|
||||
int max_dist = 0;
|
||||
switch(sbl->type) {
|
||||
case BL_HOM: max_dist = AREA_SIZE; break;
|
||||
case BL_ELEM: max_dist = MAX_ELEDISTANCE; break;
|
||||
case BL_PET: max_dist = AREA_SIZE; break;
|
||||
case BL_MER: max_dist = MAX_MER_DISTANCE; break;
|
||||
}
|
||||
// If there is a master and it's a valid type
|
||||
if(msd && (msd->bl.type&BL_PC) && max_dist){ ///TODO the bl.type is an hotfix please dig it to remove it
|
||||
if(msd && (msd->bl.type&BL_PC) && max_dist) { ///TODO the bl.type is an hotfix please dig it to remove it
|
||||
int *msd_tid = unit_get_masterteleport_timer(sbl);
|
||||
if(msd_tid == NULL) return 0;
|
||||
if (!check_distance_bl(&msd->bl, sbl, max_dist)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user