2026/05/28 Afternoon update
Updated damagtypes.2da for CEP3 reserved rows. Added and setup Darkvision icon. Added and setup Ultravision icon. Added spell icon for Thicket of Blades. Fixed Blacklight, Cloud of the Archeai, Darkness, Deeper Darkness, Damning Darkness, Utterdark, Grasping Shadows, Dawn and Dusk and Child of Shadow and Light for Telflammar Shadowlord's Shadow Blur and Shadow Sight abilities. Updated Blacklight's TLK entry. Created a constant for Shadow Discorporation. Fixed Shadow Time never ending on the targets. Updated prc_inc_combat to use monk iterative progression if warranted. Updated PRCGetIsRealSpellKnownByClass() to handle Sublime Chord better. (@Lightbeard) Added class heartbeat script for Shadowlord to handle Shadow Blur and Shadow Sight. Added ShadowlordEffects() to prc_inc_spells. Added constants for new damagetypes. Completely rewrote Verminlord's Vermin Domination. Fixed duration for Empathic Feedback. Fixed Morality Undone to not break characters over a server reset.
This commit is contained in:
@@ -1,3 +1,15 @@
|
|||||||
|
Commit: Jaysyn904
|
||||||
|
Date: Weds May 27
|
||||||
|
|
||||||
|
Verminlord requires Eldritch Blast as a prereq.
|
||||||
|
Mettle branch in ApplyBreath() is fixed.
|
||||||
|
Zen Archery now applies to Rays / Eldritch Blast.
|
||||||
|
Runes will only support divine spells.
|
||||||
|
School Specialization shouldn't block multiclass Red Wizards of Thay from divine spells in their opposition schools.
|
||||||
|
Scepters, Runes, Skull Talismans & Attuned Gems are considered spell-completion items for RWoT School Specialization.
|
||||||
|
Fixed Acolyte of the Skin's Damage Reduction. For real this time.
|
||||||
|
Sneak Attack now takes Daring Outlaw / Swashbuckler into consideration.
|
||||||
|
|
||||||
Commit: Jaysyn904
|
Commit: Jaysyn904
|
||||||
Date: Tues May 26
|
Date: Tues May 26
|
||||||
|
|
||||||
|
|||||||
@@ -14,11 +14,11 @@
|
|||||||
10 Positive 58310 8
|
10 Positive 58310 8
|
||||||
11 Sonic 58311 9
|
11 Sonic 58311 9
|
||||||
12 Base 58301 0
|
12 Base 58301 0
|
||||||
13 **** **** ****
|
13 CEP3_RESERVED **** ****
|
||||||
14 Poison 16820368 11
|
14 Poison 16820368 11
|
||||||
15 **** **** ****
|
15 CEP3_RESERVED **** ****
|
||||||
16 Psychic 16820370 13
|
16 Psychic 16820370 13
|
||||||
17 **** **** ****
|
17 CEP3_RESERVED **** ****
|
||||||
18 Radiant 16820372 15
|
18 Radiant 16820372 15
|
||||||
19 Force 16820373 16
|
19 Force 16820373 16
|
||||||
20 Untyped 16820355 17
|
20 Untyped 16820355 17
|
||||||
|
|||||||
@@ -131,3 +131,5 @@
|
|||||||
127 DAMAGE_IMMUNITY_POSITIVE_DECREASE ief_DamImmDecrp 85560
|
127 DAMAGE_IMMUNITY_POSITIVE_DECREASE ief_DamImmDecrp 85560
|
||||||
128 DAMAGE_IMMUNITY_SONIC_DECREASE ief_DamImmDecrs 85561
|
128 DAMAGE_IMMUNITY_SONIC_DECREASE ief_DamImmDecrs 85561
|
||||||
129 WOUNDING ief_Wounding 86782
|
129 WOUNDING ief_Wounding 86782
|
||||||
|
130 DARKVISION ief_darkvis 1493
|
||||||
|
131 ULTRAVISION ief_ultravis 6331
|
||||||
|
|||||||
@@ -2092,7 +2092,7 @@
|
|||||||
2088 SPELL_AP_SMITEGOOD 3779 ife_X1SmGood V T vs 0x00 0x02 apal_smitegood **** **** **** **** **** **** 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 **** **** 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2088 SPELL_AP_SMITEGOOD 3779 ife_X1SmGood V T vs 0x00 0x02 apal_smitegood **** **** **** **** **** **** 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 **** **** 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2089 SPELL_AP_AURAFEAR 16825579 is_GenAura V P vs 0x00 0x01 apal_aurafear **** **** **** **** **** **** 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 **** **** 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2089 SPELL_AP_AURAFEAR 16825579 is_GenAura V P vs 0x00 0x01 apal_aurafear **** **** **** **** **** **** 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 **** **** 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2090 SPELL_INTUTIVATK 16825914 is_X2Darkfire V P vs 0x00 0x03 prc_intuiatk **** **** **** **** **** **** 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 3 **** **** 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2090 SPELL_INTUTIVATK 16825914 is_X2Darkfire V P vs 0x00 0x03 prc_intuiatk **** **** **** **** **** **** 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 3 **** **** 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2091 Blacklight 16825540 is_Darkness V S vs 0x3a 0x2f sp_blacklight **** **** **** **** **** 3 3 1500 head **** **** vco_grndpurp sco_megrdodd01 vs_chant_evoc_lm vs_chant_evoc_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 16825541 1 0 **** 0 **** **** **** 0 **** **** **** **** **** **** 2 **** **** **** **** **** **** **** **** **** **** ****
|
2091 Blacklight 16825540 is_Darkness V S vs 0x3a 0x2f sp_blacklight **** **** **** **** **** 3 3 1500 head **** **** vco_grndpurp sco_megrdodd01 vs_chant_evoc_lm vs_chant_evoc_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 16825541 1 0 **** 0 **** **** **** 0 sphere 6.096 **** **** **** **** 2 **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2092 DarkBolt 16825538 is_RayEnfeeb V M vs 0x3d 0x2A **** **** **** **** **** **** **** 5 1500 hand **** vco_smhanevil01 **** sco_mehanevil01 vs_chant_necr_lm vs_chant_necr_lf out 1700 **** **** **** **** 0 vpr_los linked hand spr_los path **** 1 2093 2094 **** **** **** 2 **** 1 16825539 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** 3 **** **** **** **** **** **** **** **** **** **** ****
|
2092 DarkBolt 16825538 is_RayEnfeeb V M vs 0x3d 0x2A **** **** **** **** **** **** **** 5 1500 hand **** vco_smhanevil01 **** sco_mehanevil01 vs_chant_necr_lm vs_chant_necr_lf out 1700 **** **** **** **** 0 vpr_los linked hand spr_los path **** 1 2093 2094 **** **** **** 2 **** 1 16825539 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** 3 **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2093 DarkBolt_all 16825542 is_RayEnfeeb V M vs 0x3d 0x2A sp_darkbolt **** **** **** **** **** **** 5 1500 hand **** vco_smhanevil01 **** sco_mehanevil01 vs_chant_necr_lm vs_chant_necr_lf out 1700 **** **** **** **** 0 vpr_los linked hand spr_los path **** 1 **** **** **** **** **** 2 2092 1 16825539 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2093 DarkBolt_all 16825542 is_RayEnfeeb V M vs 0x3d 0x2A sp_darkbolt **** **** **** **** **** **** 5 1500 hand **** vco_smhanevil01 **** sco_mehanevil01 vs_chant_necr_lm vs_chant_necr_lf out 1700 **** **** **** **** 0 vpr_los linked hand spr_los path **** 1 **** **** **** **** **** 2 2092 1 16825539 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2094 DarkBolt_1 16825543 is_RayEnfeeb V M vs 0x3d 0x2A sp_darkbolt1 **** **** **** **** **** **** 5 1500 hand **** vco_smhanevil01 **** sco_mehanevil01 vs_chant_necr_lm vs_chant_necr_lf out 1700 **** **** **** **** 0 vpr_los linked hand spr_los path **** 1 **** **** **** **** **** 2 2092 1 16825539 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2094 DarkBolt_1 16825543 is_RayEnfeeb V M vs 0x3d 0x2A sp_darkbolt1 **** **** **** **** **** **** 5 1500 hand **** vco_smhanevil01 **** sco_mehanevil01 vs_chant_necr_lm vs_chant_necr_lf out 1700 **** **** **** **** 0 vpr_los linked hand spr_los path **** 1 **** **** **** **** **** 2 2092 1 16825539 0 0 **** 1 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
@@ -2593,7 +2593,7 @@
|
|||||||
2589 TOUCH_OF_JUIBLEX 16829600 is_tch_Juiblex T T vs 0x38 0x0a sp_tch_Juiblex **** 3 3 **** 3 3 3 1500 hand **** VCO_MEHANEVIL03 **** SCO_MEHANEVIL03 VS_CHANT_NECR_LM VS_CHANT_NECR_LF touch 1000 **** VCA_OUTEVIL01 **** sdr_darkness 0 **** **** **** **** **** **** 1 **** **** **** **** **** 3 **** 1 16829601 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** 3 **** 3 **** 3 **** **** **** 3 **** 3 ****
|
2589 TOUCH_OF_JUIBLEX 16829600 is_tch_Juiblex T T vs 0x38 0x0a sp_tch_Juiblex **** 3 3 **** 3 3 3 1500 hand **** VCO_MEHANEVIL03 **** SCO_MEHANEVIL03 VS_CHANT_NECR_LM VS_CHANT_NECR_LF touch 1000 **** VCA_OUTEVIL01 **** sdr_darkness 0 **** **** **** **** **** **** 1 **** **** **** **** **** 3 **** 1 16829601 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** 3 **** 3 **** 3 **** **** **** 3 **** 3 ****
|
||||||
2590 UNHEAVENED 16829602 is_unheavened A T vs 0x38 0x0a sp_unheavened **** **** **** **** **** 2 2 1500 hand **** VCO_MEHANEVIL01 **** SCO_MEHANEVIL01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTEVIL01 **** adr_freemove 0 **** **** **** **** **** **** 1 **** **** **** **** **** 9 **** 1 16829603 1 0 **** 0 **** **** **** **** **** **** **** **** 2 **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2590 UNHEAVENED 16829602 is_unheavened A T vs 0x38 0x0a sp_unheavened **** **** **** **** **** 2 2 1500 hand **** VCO_MEHANEVIL01 **** SCO_MEHANEVIL01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTEVIL01 **** adr_freemove 0 **** **** **** **** **** **** 1 **** **** **** **** **** 9 **** 1 16829603 1 0 **** 0 **** **** **** **** **** **** **** **** 2 **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2591 UNLIVING_WEAPON 16829604 is_unliv_weap N T vs 0x3d 0x0a sp_unliv_weap **** 3 **** **** **** **** 3 1500 hand **** VCO_MEHANEVIL01 **** SCO_MEHANEVIL01 VS_CHANT_NECR_HM VS_CHANT_NECR_HF touch 1000 **** VCA_OUTEVIL01 **** sce_negative 0 **** **** **** **** **** **** 1 **** **** **** **** **** 9 **** 1 16829605 1 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2591 UNLIVING_WEAPON 16829604 is_unliv_weap N T vs 0x3d 0x0a sp_unliv_weap **** 3 **** **** **** **** 3 1500 hand **** VCO_MEHANEVIL01 **** SCO_MEHANEVIL01 VS_CHANT_NECR_HM VS_CHANT_NECR_HF touch 1000 **** VCA_OUTEVIL01 **** sce_negative 0 **** **** **** **** **** **** 1 **** **** **** **** **** 9 **** 1 16829605 1 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2592 UTTERDARK 16829606 is_utterdark C P vs 0x3a 0x09 sp_utterdark **** **** **** **** **** 9 9 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEHEDEVIL01 VS_CHANT_CONJ_HM VS_CHANT_CONJ_HF Area 1000 **** **** **** SDR_DARKNESS 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829607 1 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2592 UTTERDARK 16829606 is_utterdark C P vs 0x3a 0x09 sp_utterdark **** **** **** **** **** 9 9 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEHEDEVIL01 VS_CHANT_CONJ_HM VS_CHANT_CONJ_HF Area 1000 **** **** **** SDR_DARKNESS 0 **** **** **** **** **** **** 1 **** **** **** **** **** 1 **** 1 16829607 1 0 **** 0 **** **** **** **** sphere 30.48 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2593 WAVE_OF_GRIEF 16829608 is_wave_grief E S s 0x2a 0x0e sp_wave_grief 2 2 **** **** **** **** 2 1500 hand **** VCO_MEHANEVIL03 **** SCO_MEHANEVIL03 VS_CHANT_ENCH_HM VS_CHANT_ENCH_HF Area 1700 **** VCA_OUTEVIL01 **** SDR_GHOSTLY 0 **** **** **** **** **** **** 1 **** **** **** **** **** 11 **** 1 16829609 1 0 **** 1 **** **** **** **** cone 7.62 **** 19 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2593 WAVE_OF_GRIEF 16829608 is_wave_grief E S s 0x2a 0x0e sp_wave_grief 2 2 **** **** **** **** 2 1500 hand **** VCO_MEHANEVIL03 **** SCO_MEHANEVIL03 VS_CHANT_ENCH_HM VS_CHANT_ENCH_HF Area 1700 **** VCA_OUTEVIL01 **** SDR_GHOSTLY 0 **** **** **** **** **** **** 1 **** **** **** **** **** 11 **** 1 16829609 1 0 **** 1 **** **** **** **** cone 7.62 **** 19 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2594 WAVE_OF_PAIN 16829610 is_wave_pain N S s 0x2a 0x0c sp_wave_pain 6 **** **** **** **** **** 6 1500 hand **** VCO_MEHANEVIL01 **** SCO_GAZEEVIL VS_CHANT_NECR_HM VS_CHANT_NECR_HF Area 1700 **** VCA_OUTEVIL01 **** SDR_GHOSTLY 0 **** **** **** **** **** **** 1 **** **** **** **** **** 11 **** 1 16829611 1 0 **** 1 **** **** **** **** cone 7.62 **** 19 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2594 WAVE_OF_PAIN 16829610 is_wave_pain N S s 0x2a 0x0c sp_wave_pain 6 **** **** **** **** **** 6 1500 hand **** VCO_MEHANEVIL01 **** SCO_GAZEEVIL VS_CHANT_NECR_HM VS_CHANT_NECR_HF Area 1700 **** VCA_OUTEVIL01 **** SDR_GHOSTLY 0 **** **** **** **** **** **** 1 **** **** **** **** **** 11 **** 1 16829611 1 0 **** 1 **** **** **** **** cone 7.62 **** 19 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2595 WRACK 16829612 is_wrack N S vs 0x3a 0x0a sp_wrack **** 3 **** **** **** 4 3 1500 hand **** VCO_MEHANEVIL03 **** SCO_MEHANEVIL03 VS_CHANT_NECR_HM VS_CHANT_NECR_HF out 1000 **** VCA_OUTEVIL01 **** SCA_OUTNEG 0 **** **** **** **** **** **** 1 **** **** **** **** **** 2 **** 1 16829613 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2595 WRACK 16829612 is_wrack N S vs 0x3a 0x0a sp_wrack **** 3 **** **** **** 4 3 1500 hand **** VCO_MEHANEVIL03 **** SCO_MEHANEVIL03 VS_CHANT_NECR_HM VS_CHANT_NECR_HF out 1000 **** VCA_OUTEVIL01 **** SCA_OUTNEG 0 **** **** **** **** **** **** 1 **** **** **** **** **** 2 **** 1 16829613 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
|||||||
@@ -170,7 +170,7 @@
|
|||||||
166 AOE_PER_DESERT_TEMPEST C 1.3 **** **** tob_dw_dsttmpta **** **** 0 274 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
166 AOE_PER_DESERT_TEMPEST C 1.3 **** **** tob_dw_dsttmpta **** **** 0 274 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
167 AOE_MOB_MOUNTAIN_AVALANCHE C 1 **** **** tob_stdr_mtavlA **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
167 AOE_MOB_MOUNTAIN_AVALANCHE C 1 **** **** tob_stdr_mtavlA **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
168 VFX_PER_SNARE C 3.048 **** **** sp_snareA **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
168 VFX_PER_SNARE C 3.048 **** **** sp_snareA **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
169 AOE_PER_PYROTECHNICS_SMOKE C 6.096 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
169 AOE_PER_PYROTECHNICS_SMOKE C 6.096 **** **** sp_pyrotechnicsA sp_pyrotechnicsB **** **** **** vpr_gas vps_fogmind vim_mentcloud 3 3 3 3400 1100 1900 0 0 0.25 **** sps_fog_loop **** sps_fog 0.3 vpr_gas_L vpr_gas_L vpr_gas_L
|
||||||
170 AOE_PER_FIRE_TRAP C 1.524 **** **** sp_fire_trapA **** **** 0 **** vps_delfireb vps_delfireb vps_delfireb 5 5 5 3400 1100 1900 0 0 0.25 **** sps_delfireb **** **** **** vps_delfireb_L vps_delfireb_L vps_delfireb_L
|
170 AOE_PER_FIRE_TRAP C 1.524 **** **** sp_fire_trapA **** **** 0 **** vps_delfireb vps_delfireb vps_delfireb 5 5 5 3400 1100 1900 0 0 0.25 **** sps_delfireb **** **** **** vps_delfireb_L vps_delfireb_L vps_delfireb_L
|
||||||
171 VFX_PER_PRISMATIC_WALL R **** 15 1 sp_prism_wallA **** **** **** 891 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
171 VFX_PER_PRISMATIC_WALL R **** 15 1 sp_prism_wallA **** **** **** 891 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
172 VFX_MOB_RING_OF_BLADES C 1.524 **** **** sp_ring_bldsa **** sp_ring_bldsc **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
172 VFX_MOB_RING_OF_BLADES C 1.524 **** **** sp_ring_bldsa **** sp_ring_bldsc **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
@@ -206,7 +206,7 @@
|
|||||||
202 VFX_PER_FOGPURPLE C 5 **** **** **** **** **** 0 **** vps_fogpurp vps_fogpurp vps_fogpurp 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogpurp_L vps_fogpurp_L vps_fogpurp_L
|
202 VFX_PER_FOGPURPLE C 5 **** **** **** **** **** 0 **** vps_fogpurp vps_fogpurp vps_fogpurp 5 10 5 3400 1100 1900 0 0.25 0.25 **** sps_fog_loop **** sps_fog 0.3 vps_fogpurp_L vps_fogpurp_L vps_fogpurp_L
|
||||||
203 AOE_PER_DAMNDARK C 6.7 **** **** sp_damng_darka sp_damng_darkb **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** sps_darkness **** **** **** **** **** **** ****
|
203 AOE_PER_DAMNDARK C 6.7 **** **** sp_damng_darka sp_damng_darkb **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** sps_darkness **** **** **** **** **** **** ****
|
||||||
204 VFX_MOB_BRILLIANT_EMANATION C 30.48 **** **** sp_brill_emanA sp_brill_emanB **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
204 VFX_MOB_BRILLIANT_EMANATION C 30.48 **** **** sp_brill_emanA sp_brill_emanB **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
205 VFX_PER_UTTERDARK C 50 **** **** sp_utterdarkA sp_utterdarkB **** 0 844 **** **** **** **** **** **** **** **** **** **** **** **** sps_darkness **** **** **** **** **** **** ****
|
205 VFX_PER_UTTERDARK C 30.48 **** **** sp_utterdarkA sp_utterdarkB **** 0 844 **** **** **** **** **** **** **** **** **** **** **** **** sps_darkness **** **** **** **** **** **** ****
|
||||||
206 VFX_PER_ACHAIERAI C 3.048 **** **** sp_cloud_achai sp_cloud_achaiB **** 0 845 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
206 VFX_PER_ACHAIERAI C 3.048 **** **** sp_cloud_achai sp_cloud_achaiB **** 0 845 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
207 VFX_PER_WALLFROST R **** 10 2 sp_wallfrosta **** sp_wallfrostc 0 **** vps_wallfrost vps_wallfrost vps_wallfrost 3 3 3 300 450 530 0 0 0 **** sps_wallfire **** **** **** vps_wallfrost_L vps_wallfrost_L vps_wallfrost_L
|
207 VFX_PER_WALLFROST R **** 10 2 sp_wallfrosta **** sp_wallfrostc 0 **** vps_wallfrost vps_wallfrost vps_wallfrost 3 3 3 300 450 530 0 0 0 **** sps_wallfire **** **** **** vps_wallfrost_L vps_wallfrost_L vps_wallfrost_L
|
||||||
208 VFX_PER_WALLGRN R **** 10 2 **** **** **** 0 **** vps_wallgrn vps_wallgrn vps_wallgrn 3 3 3 300 450 530 0 0 0 **** sps_wallfire **** **** **** vps_wallgrn_L vps_wallgrn_L vps_wallgrn_L
|
208 VFX_PER_WALLGRN R **** 10 2 **** **** **** 0 **** vps_wallgrn vps_wallgrn vps_wallgrn 3 3 3 300 450 530 0 0 0 **** sps_wallfire **** **** **** vps_wallgrn_L vps_wallgrn_L vps_wallgrn_L
|
||||||
|
|||||||
BIN
nwn/nwnprc/trunk/gfx/ief_ultravis.tga
Normal file
BIN
nwn/nwnprc/trunk/gfx/ief_ultravis.tga
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/gfx/im_thicketblades.tga
Normal file
BIN
nwn/nwnprc/trunk/gfx/im_thicketblades.tga
Normal file
Binary file not shown.
@@ -73,6 +73,7 @@ void RemoveTSFromObject(object oTarget)
|
|||||||
|| nSpellId == 14205 // POWER_TEMPORALACCELERATION
|
|| nSpellId == 14205 // POWER_TEMPORALACCELERATION
|
||||||
|| nSpellId == 17366 // MOVE_DM_MOMENT_ALACRITY
|
|| nSpellId == 17366 // MOVE_DM_MOMENT_ALACRITY
|
||||||
|| nSpellId == 17511 // MOVE_WR_WHITE_RAVEN_TACTICS
|
|| nSpellId == 17511 // MOVE_WR_WHITE_RAVEN_TACTICS
|
||||||
|
|| nSpellId == 18428 // MYST_SHADOW_TIME
|
||||||
)
|
)
|
||||||
RemoveEffect(oTarget, eTest);
|
RemoveEffect(oTarget, eTest);
|
||||||
eTest = GetNextEffect(oTarget);
|
eTest = GetNextEffect(oTarget);
|
||||||
@@ -81,3 +82,5 @@ void RemoveTSFromObject(object oTarget)
|
|||||||
StopFade(oTarget);
|
StopFade(oTarget);
|
||||||
SetCommandable(TRUE, oTarget);
|
SetCommandable(TRUE, oTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//void main(){}
|
||||||
@@ -2235,6 +2235,7 @@ const int FEAT_INSECT_PLAGUE = 2312; //CONSTANT
|
|||||||
const int FEAT_SUMMON_CORNUGON = 2313; //CONSTANT
|
const int FEAT_SUMMON_CORNUGON = 2313; //CONSTANT
|
||||||
const int FEAT_BEGUILEING_NATURE = 2314; //CONSTANT
|
const int FEAT_BEGUILEING_NATURE = 2314; //CONSTANT
|
||||||
|
|
||||||
|
//:: Fist of Hextor Feats
|
||||||
const int FEAT_DEVICE_LORE = 2333;
|
const int FEAT_DEVICE_LORE = 2333;
|
||||||
const int FEAT_IRON_HEWS = 2334;
|
const int FEAT_IRON_HEWS = 2334;
|
||||||
const int FEAT_RUSTING_GRASP = 2335;
|
const int FEAT_RUSTING_GRASP = 2335;
|
||||||
@@ -2245,6 +2246,9 @@ const int FEAT_GREATER_IRON_HEWS = 2339;
|
|||||||
const int FEAT_IRON_SKIN = 2340;
|
const int FEAT_IRON_SKIN = 2340;
|
||||||
const int FEAT_IRON_BODY = 2341;
|
const int FEAT_IRON_BODY = 2341;
|
||||||
|
|
||||||
|
//:: Telflammar Shadowlord Feats
|
||||||
|
const int FEAT_SHADOWDISCORPO = 3305;
|
||||||
|
|
||||||
const int FEAT_COFFIN_SANCTUARY = 2343;
|
const int FEAT_COFFIN_SANCTUARY = 2343;
|
||||||
const int FEAT_GASEOUS_FORM = 2344;
|
const int FEAT_GASEOUS_FORM = 2344;
|
||||||
|
|
||||||
|
|||||||
@@ -8803,7 +8803,9 @@ void AttackLoopMain(object oDefender, object oAttacker,
|
|||||||
if(DEBUG) DoDebug("Entered AttackLoopMain: bonus attacks = " + IntToString(iBonusAttacks)+", main attacks = "+IntToString(iMainAttacks)+", offhand attacks = "+IntToString(iOffHandAttacks));
|
if(DEBUG) DoDebug("Entered AttackLoopMain: bonus attacks = " + IntToString(iBonusAttacks)+", main attacks = "+IntToString(iMainAttacks)+", offhand attacks = "+IntToString(iOffHandAttacks));
|
||||||
|
|
||||||
// ugly workaround to make this global available for other functions after a call to DelayCommand or AssignCommand
|
// ugly workaround to make this global available for other functions after a call to DelayCommand or AssignCommand
|
||||||
bUseMonkAttackMod = sAttackVars.bUseMonkAttackMod;
|
//bUseMonkAttackMod = sAttackVars.bUseMonkAttackMod;
|
||||||
|
|
||||||
|
sAttackVars.bUseMonkAttackMod = GetHasMonkWeaponEquipped(oAttacker);
|
||||||
|
|
||||||
// turn off touch attack if var says it only applies to first attack
|
// turn off touch attack if var says it only applies to first attack
|
||||||
if (sAttackVars.iAttackNumber && !sAttackVars.bApplyTouchToAll) sAttackVars.iTouchAttackType == FALSE;
|
if (sAttackVars.iAttackNumber && !sAttackVars.bApplyTouchToAll) sAttackVars.iTouchAttackType == FALSE;
|
||||||
|
|||||||
@@ -665,6 +665,53 @@ int PRCGetIsRealSpellKnownByClass(int nRealSpellID, int nClass, object oPC = OBJ
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get the cls_spell_***.2da index for the real spell
|
||||||
|
int nSpellbookSpell = RealSpellToSpellbookID(nClass, nRealSpellID);
|
||||||
|
if (nSpellbookSpell == -1)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
string sFile = GetFileForClass(nClass);
|
||||||
|
string sSpellLevel = Get2DACache(sFile, "Level", nSpellbookSpell);
|
||||||
|
if (sSpellLevel == "")
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
int nSpellLevel = StringToInt(sSpellLevel);
|
||||||
|
int nSpellbookType = GetSpellbookTypeForClass(nClass);
|
||||||
|
|
||||||
|
// Check whether the class can actually cast spells of this circle.
|
||||||
|
int nCasterLevel = GetSpellslotLevel(nClass, oPC);
|
||||||
|
int nAbility = GetAbilityScoreForClass(nClass, oPC);
|
||||||
|
if (GetSlotCount(nCasterLevel, nSpellLevel, nAbility, nClass, oPC) <= 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
// Prepared casters know their full list, except Archivist.
|
||||||
|
if (nSpellbookType == SPELLBOOK_TYPE_PREPARED && nClass != CLASS_TYPE_ARCHIVIST)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
// Spontaneous casters only know spells they've actually learned.
|
||||||
|
if (nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS)
|
||||||
|
{
|
||||||
|
int nFeatID = StringToInt(Get2DACache(sFile, "FeatID", nSpellbookSpell));
|
||||||
|
if (GetHasFeat(nFeatID, oPC))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// checks if oPC knows the specified spell
|
||||||
|
// only works for classes that use the PRC spellbook, there is currently no way to do this for Bioware spellcasters
|
||||||
|
// this will only check the spellbook of the class specified
|
||||||
|
/* int PRCGetIsRealSpellKnownByClass(int nRealSpellID, int nClass, object oPC = OBJECT_SELF)
|
||||||
|
{
|
||||||
|
// check for whether bard and sorc are using the prc spellbooks
|
||||||
|
if (nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_SORCERER)
|
||||||
|
{
|
||||||
|
if(!UseNewSpellBook(oPC))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
// get the cls_spell_***.2da index for the real spell
|
// get the cls_spell_***.2da index for the real spell
|
||||||
int nSpellbookSpell = RealSpellToSpellbookID(nClass, nRealSpellID);
|
int nSpellbookSpell = RealSpellToSpellbookID(nClass, nRealSpellID);
|
||||||
// if the spell does not exist in the spellbook, return FALSE
|
// if the spell does not exist in the spellbook, return FALSE
|
||||||
@@ -692,7 +739,7 @@ int PRCGetIsRealSpellKnownByClass(int nRealSpellID, int nClass, object oPC = OBJ
|
|||||||
// at this stage, prepared casters know the spell and only spontaneous classes need checking
|
// at this stage, prepared casters know the spell and only spontaneous classes need checking
|
||||||
// there are exceptions and these need hardcoding:
|
// there are exceptions and these need hardcoding:
|
||||||
|
|
||||||
if((GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_PREPARED) && nClass != CLASS_TYPE_ARCHIVIST)
|
/* if((GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_PREPARED) && nClass != CLASS_TYPE_ARCHIVIST)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
// spontaneous casters have all their known spells as hide feats
|
// spontaneous casters have all their known spells as hide feats
|
||||||
@@ -703,6 +750,7 @@ int PRCGetIsRealSpellKnownByClass(int nRealSpellID, int nClass, object oPC = OBJ
|
|||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
//routes to action cast spell, but puts a wrapper around to tell other functions its a
|
//routes to action cast spell, but puts a wrapper around to tell other functions its a
|
||||||
//SLA, so dont craft etc
|
//SLA, so dont craft etc
|
||||||
|
|||||||
@@ -214,6 +214,7 @@ void SetupCharacterData(object oPC)
|
|||||||
case CLASS_TYPE_SHADOWSMITH: iData |= 0x01; break;
|
case CLASS_TYPE_SHADOWSMITH: iData |= 0x01; break;
|
||||||
case CLASS_TYPE_SHADOW_SUN_NINJA: sScript = "tob_shadowsun"; break;
|
case CLASS_TYPE_SHADOW_SUN_NINJA: sScript = "tob_shadowsun"; break;
|
||||||
case CLASS_TYPE_SHADOWBLADE: sScript = "prc_sb_shdstlth"; break;
|
case CLASS_TYPE_SHADOWBLADE: sScript = "prc_sb_shdstlth"; break;
|
||||||
|
case CLASS_TYPE_SHADOWLORD: sScript = "prc_shadowlord"; break;
|
||||||
case CLASS_TYPE_SHADOWMIND: sScript = "psi_shadowmind"; break;
|
case CLASS_TYPE_SHADOWMIND: sScript = "psi_shadowmind"; break;
|
||||||
case CLASS_TYPE_SHADOWBANE_STALKER: sScript = "prc_shadstalker"; break;
|
case CLASS_TYPE_SHADOWBANE_STALKER: sScript = "prc_shadstalker"; break;
|
||||||
case CLASS_TYPE_SHADOW_THIEF_AMN: sScript = "prc_amn"; break;
|
case CLASS_TYPE_SHADOW_THIEF_AMN: sScript = "prc_amn"; break;
|
||||||
|
|||||||
@@ -20,6 +20,26 @@
|
|||||||
/* Function prototypes */
|
/* Function prototypes */
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a linked effect bundle containing Shadowlord ultravision,
|
||||||
|
* visual feedback effects, and concealment for higher Shadowlord levels.
|
||||||
|
*
|
||||||
|
* @param iShadow
|
||||||
|
* Shadowlord level of the target creature.
|
||||||
|
*
|
||||||
|
* @param eBaseEffect
|
||||||
|
* Existing linked effect bundle to append effects to.
|
||||||
|
* Typically ePnP, eLink, or eLink2.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* Updated linked effect bundle containing:
|
||||||
|
* - Ultravision
|
||||||
|
* - Ultravision icon
|
||||||
|
* - Magical sight visuals
|
||||||
|
* - Positive effect visuals
|
||||||
|
* - 20% concealment at Shadowlord level 2+
|
||||||
|
*/
|
||||||
|
effect ShadowlordEffects(int iShadow, effect eBaseEffect);
|
||||||
|
|
||||||
|
|
||||||
//:: Calculates total Shield AC bonuses from all sources
|
//:: Calculates total Shield AC bonuses from all sources
|
||||||
@@ -381,6 +401,30 @@ const int TYPE_DIVINE = -2;
|
|||||||
/* Function definitions */
|
/* Function definitions */
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
|
effect ShadowlordEffects(int iShadow, effect eBaseEffect)
|
||||||
|
{
|
||||||
|
|
||||||
|
//:: Create visual feedback effect link
|
||||||
|
effect eVis = EffectVisualEffect(VFX_DUR_ULTRAVISION);
|
||||||
|
eVis = EffectLinkEffects(eVis, EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE));
|
||||||
|
eVis = EffectLinkEffects(eVis, EffectVisualEffect(VFX_DUR_MAGICAL_SIGHT));
|
||||||
|
eVis = EffectLinkEffects(eVis, EffectIcon(EFFECT_ICON_ULTRAVISION));
|
||||||
|
|
||||||
|
//:: Link Ultravision and visual feedback into base effect
|
||||||
|
eBaseEffect = EffectLinkEffects(eBaseEffect, EffectUltravision());
|
||||||
|
eBaseEffect = EffectLinkEffects(eBaseEffect, eVis);
|
||||||
|
if(DEBUG) DoDebug("ShadowlordEffects() >> Setting up Ultravision");
|
||||||
|
|
||||||
|
if (iShadow > 1)
|
||||||
|
{
|
||||||
|
//;: Add concealment for level 2+ Shadowlords
|
||||||
|
eBaseEffect = EffectLinkEffects(eBaseEffect, EffectConcealment(20));
|
||||||
|
if(DEBUG) DoDebug("ShadowlordEffects() >> Setting up Concealment");
|
||||||
|
}
|
||||||
|
|
||||||
|
return eBaseEffect;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Returns TRUE if nSpellID is a subradial spell, FALSE otherwise
|
// Returns TRUE if nSpellID is a subradial spell, FALSE otherwise
|
||||||
int GetIsSubradialSpell(int nSpellID)
|
int GetIsSubradialSpell(int nSpellID)
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ const string PRC_PNP_FIND_TRAPS = "PRC_PNP_FIND_TRAPS";
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* PnP Darkness
|
* PnP Darkness
|
||||||
* Is a mobile AOE based off an item
|
* Is a mobile AOE based off an item when cast on a creature.
|
||||||
*/
|
*/
|
||||||
const string PRC_PNP_DARKNESS = "PRC_PNP_DARKNESS";
|
const string PRC_PNP_DARKNESS = "PRC_PNP_DARKNESS";
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,23 @@
|
|||||||
* but aren't numerous enough to warrant their own.
|
* but aren't numerous enough to warrant their own.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
//:: New effect icons (effecticons.2da)
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
const int EFFECT_ICON_DARKVISION = 130;
|
||||||
|
const int EFFECT_ICON_ULTRAVISION = 131;
|
||||||
|
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
//:: New damage types (damagetypes.2da)
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
const int DAMAGE_TYPE_POISON = 16384; // CUSTOM2
|
||||||
|
const int DAMAGE_TYPE_PSYCHIC = 32768; // CUSTOM4
|
||||||
|
const int DAMAGE_TYPE_RADIANT = 65536; // CUSTOM6
|
||||||
|
const int DAMAGE_TYPE_FORCE = 524288; // CUSTOM7
|
||||||
|
const int DAMAGE_TYPE_UNTYPED = 1048576; // CUSTOM8
|
||||||
|
const int DAMAGE_TYPE_VILE = 2097152; // CUSTOM9
|
||||||
|
|
||||||
|
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
//:: New base item types
|
//:: New base item types
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
|
|||||||
@@ -2730,6 +2730,40 @@ void X2BreakConcentrationSpells()
|
|||||||
//end Dragonsong Lyrist songs
|
//end Dragonsong Lyrist songs
|
||||||
DeleteLocalInt(OBJECT_SELF, "SpellConc");
|
DeleteLocalInt(OBJECT_SELF, "SpellConc");
|
||||||
|
|
||||||
|
if(GetPRCSwitch(PRC_PNP_BLACK_BLADE_OF_DISASTER))
|
||||||
|
{
|
||||||
|
//this is also in summon HB
|
||||||
|
//but needed here to handle quickend spells
|
||||||
|
//Disintegrate is cast from the blade so doesn't end the summon
|
||||||
|
|
||||||
|
// Determine the correct tag based on PRC switch
|
||||||
|
string sTargetTag = GetPRCSwitch(PRC_PNP_BLACK_BLADE_OF_DISASTER) ? "prc_bbod001" : "x2_s_bblade";
|
||||||
|
|
||||||
|
// Loop through all summoned associates
|
||||||
|
int i = 1;
|
||||||
|
object oAssoc = GetAssociate(ASSOCIATE_TYPE_SUMMONED, OBJECT_SELF, i);
|
||||||
|
while(GetIsObjectValid(oAssoc))
|
||||||
|
{
|
||||||
|
string sTag = GetTag(oAssoc);
|
||||||
|
// Use case-insensitive comparison
|
||||||
|
if(GetStringLowerCase(sTag) == GetStringLowerCase(sTargetTag))
|
||||||
|
{
|
||||||
|
if(GetLocalInt(oAssoc, "X2_L_CREATURE_NEEDS_CONCENTRATION"))
|
||||||
|
{
|
||||||
|
SignalEvent(oAssoc, EventUserDefined(X2_EVENT_CONCENTRATION_BROKEN));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
oAssoc = GetAssociate(ASSOCIATE_TYPE_SUMMONED, OBJECT_SELF, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* void X2BreakConcentrationSpells()
|
||||||
|
{
|
||||||
|
//end Dragonsong Lyrist songs
|
||||||
|
DeleteLocalInt(OBJECT_SELF, "SpellConc");
|
||||||
|
|
||||||
if(GetPRCSwitch(PRC_PNP_BLACK_BLADE_OF_DISASTER))
|
if(GetPRCSwitch(PRC_PNP_BLACK_BLADE_OF_DISASTER))
|
||||||
{
|
{
|
||||||
//this is also in summon HB
|
//this is also in summon HB
|
||||||
@@ -2747,7 +2781,7 @@ void X2BreakConcentrationSpells()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} */
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// being hit by any kind of negative effect affecting the caster's ability to concentrate
|
// being hit by any kind of negative effect affecting the caster's ability to concentrate
|
||||||
|
|||||||
@@ -1,17 +1,49 @@
|
|||||||
/*
|
/*
|
||||||
Warlock epic feat
|
Warlock epic feat
|
||||||
Verminlord dominating vermin
|
Verminlord dominating vermin
|
||||||
|
|
||||||
|
Fixed By: Jaysyn
|
||||||
|
Date: 2026-05-27 19:43:38
|
||||||
*/
|
*/
|
||||||
#include "prc_inc_racial"
|
#include "prc_inc_racial"
|
||||||
#include "inv_inc_invfunc"
|
#include "inv_inc_invfunc"
|
||||||
|
#include "prc_inc_spells"
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
object oTarget = PRCGetSpellTargetObject();
|
object oTarget = PRCGetSpellTargetObject();
|
||||||
int nRacialType = MyPRCGetRacialType(oTarget);
|
int nRacialType = MyPRCGetRacialType(oTarget);
|
||||||
|
|
||||||
|
if(nRacialType != RACIAL_TYPE_VERMIN)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int nCasterLevel = GetInvokerLevel(OBJECT_SELF, CLASS_TYPE_WARLOCK);
|
||||||
|
int nDuration = nCasterLevel;
|
||||||
|
|
||||||
|
// Spell resistance check
|
||||||
|
if(PRCDoResistSpell(OBJECT_SELF, oTarget, nCasterLevel))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Will save (but not as mind-affecting for vermin)
|
||||||
|
if(PRCMySavingThrow(SAVING_THROW_WILL, oTarget, PRCGetSaveDC(oTarget, OBJECT_SELF), SAVING_THROW_TYPE_NONE))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Apply supernatural domination effect that bypasses mind immunity
|
||||||
|
effect eDom = SupernaturalEffect(EffectCutsceneDominated());
|
||||||
|
effect eVis = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DOMINATED);
|
||||||
|
effect eLink = EffectLinkEffects(eDom, eVis);
|
||||||
|
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, TurnsToSeconds(nDuration), TRUE, -1, nCasterLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* void main()
|
||||||
|
{
|
||||||
|
object oTarget = PRCGetSpellTargetObject();
|
||||||
|
int nRacialType = MyPRCGetRacialType(oTarget);
|
||||||
|
|
||||||
if(nRacialType != RACIAL_TYPE_VERMIN)
|
if(nRacialType != RACIAL_TYPE_VERMIN)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DoRacialSLA(SPELL_DOMINATE_MONSTER, GetInvokerLevel(OBJECT_SELF, CLASS_TYPE_WARLOCK));
|
DoRacialSLA(SPELL_DOMINATE_MONSTER, GetInvokerLevel(OBJECT_SELF, CLASS_TYPE_WARLOCK));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
@@ -29,6 +29,14 @@ void main()
|
|||||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||||
effect eLink = EffectLinkEffects(eDark, eDur);
|
effect eLink = EffectLinkEffects(eDark, eDur);
|
||||||
|
|
||||||
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
|
if (iShadow)
|
||||||
|
{
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
struct mystery myst = GetLocalMystery(oShadow, MYST_HOLD_MYST+"6");
|
struct mystery myst = GetLocalMystery(oShadow, MYST_HOLD_MYST+"6");
|
||||||
|
|
||||||
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oShadow))
|
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oShadow))
|
||||||
|
|||||||
@@ -24,6 +24,17 @@ void main()
|
|||||||
object oTarget = GetExitingObject();
|
object oTarget = GetExitingObject();
|
||||||
struct mystery myst = GetLocalMystery(oShadow, MYST_HOLD_MYST+"6");
|
struct mystery myst = GetLocalMystery(oShadow, MYST_HOLD_MYST+"6");
|
||||||
|
|
||||||
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
|
while(GetIsEffectValid(eEffect))
|
||||||
|
{
|
||||||
|
if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
if(DEBUG) DoDebug("shd_myst_dskdwnb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
eEffect = GetNextEffect(oTarget);
|
||||||
|
}
|
||||||
|
|
||||||
// Loop over effects, removing the ones from this power
|
// Loop over effects, removing the ones from this power
|
||||||
effect eAOE;
|
effect eAOE;
|
||||||
if(GetHasSpellEffect(MYST_DUSK_AND_DAWN_DUSK, oTarget) || GetHasSpellEffect(FUND_BLACK_CANDLE_DARK, oTarget) || GetHasSpellEffect(MYST_DEADLY_SHADE_DR, oTarget) || GetHasSpellEffect(MYST_DEADLY_SHADE_NEG, oTarget))
|
if(GetHasSpellEffect(MYST_DUSK_AND_DAWN_DUSK, oTarget) || GetHasSpellEffect(FUND_BLACK_CANDLE_DARK, oTarget) || GetHasSpellEffect(MYST_DEADLY_SHADE_DR, oTarget) || GetHasSpellEffect(MYST_DEADLY_SHADE_NEG, oTarget))
|
||||||
|
|||||||
@@ -37,6 +37,14 @@ void main()
|
|||||||
|
|
||||||
struct mystery myst = GetLocalMystery(oShadow, MYST_HOLD_MYST);
|
struct mystery myst = GetLocalMystery(oShadow, MYST_HOLD_MYST);
|
||||||
|
|
||||||
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
|
if (iShadow)
|
||||||
|
{
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oShadow) && GetCreatureFlag(oTarget, CREATURE_VAR_IS_INCORPOREAL) != TRUE)
|
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oShadow) && GetCreatureFlag(oTarget, CREATURE_VAR_IS_INCORPOREAL) != TRUE)
|
||||||
{
|
{
|
||||||
//Fire cast spell at event for the target
|
//Fire cast spell at event for the target
|
||||||
|
|||||||
@@ -28,6 +28,18 @@ void main()
|
|||||||
|
|
||||||
// Loop over effects, removing the ones from this power
|
// Loop over effects, removing the ones from this power
|
||||||
effect eAOE;
|
effect eAOE;
|
||||||
|
|
||||||
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
|
while(GetIsEffectValid(eEffect))
|
||||||
|
{
|
||||||
|
if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
if(DEBUG) DoDebug("sp_blacklightb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
eEffect = GetNextEffect(oTarget);
|
||||||
|
}
|
||||||
|
|
||||||
if(GetHasSpellEffect(MYST_GRASPING_SHADOWS, oTarget))
|
if(GetHasSpellEffect(MYST_GRASPING_SHADOWS, oTarget))
|
||||||
{
|
{
|
||||||
//Search through the valid effects on the target.
|
//Search through the valid effects on the target.
|
||||||
|
|||||||
@@ -67,6 +67,14 @@ void main()
|
|||||||
{// Applies to everyone
|
{// Applies to everyone
|
||||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 6.0);
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 6.0);
|
||||||
|
|
||||||
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
|
if (iShadow)
|
||||||
|
{
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
oTarget = GetNextObjectInShape(SHAPE_SPHERE, FeetToMeters(60.0), GetLocation(oInitiator));
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, FeetToMeters(60.0), GetLocation(oInitiator));
|
||||||
}
|
}
|
||||||
// Give oInitiator a little graphic
|
// Give oInitiator a little graphic
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ void main()
|
|||||||
{
|
{
|
||||||
int nDamage = 5 + manif.nTimesAugOptUsed_1;
|
int nDamage = 5 + manif.nTimesAugOptUsed_1;
|
||||||
effect eDur = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE);
|
effect eDur = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE);
|
||||||
float fDuration = 60.0f * manif.nManifesterLevel;
|
float fDuration = 600.0f * manif.nManifesterLevel;
|
||||||
if(manif.bExtend) fDuration *= 2;
|
if(manif.bExtend) fDuration *= 2;
|
||||||
|
|
||||||
// Get the OnHitCast: Unique on the target's armor / hide
|
// Get the OnHitCast: Unique on the target's armor / hide
|
||||||
|
|||||||
@@ -102,6 +102,18 @@ void main()
|
|||||||
DelayCommand(6.0, ExecuteScript("prc_onhb_indiv", oPC));
|
DelayCommand(6.0, ExecuteScript("prc_onhb_indiv", oPC));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for Morality Undone expiration
|
||||||
|
if(GetPersistantLocalInt(oPC, "MoralityUndone_Expire") > 0)
|
||||||
|
{
|
||||||
|
if(GetTimeSecond() >= GetPersistantLocalInt(oPC, "MoralityUndone_Expire"))
|
||||||
|
{
|
||||||
|
int nShiftAmount = GetPersistantLocalInt(oPC, "MoralityUndone_ShiftAmount");
|
||||||
|
AdjustAlignment(oPC, ALIGNMENT_GOOD, nShiftAmount, FALSE);
|
||||||
|
DeletePersistantLocalInt(oPC, "MoralityUndone_Expire");
|
||||||
|
DeletePersistantLocalInt(oPC, "MoralityUndone_ShiftAmount");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* PC_damage code to support oni's scripts
|
/* PC_damage code to support oni's scripts
|
||||||
* If HP is over 1 apply the damage and let
|
* If HP is over 1 apply the damage and let
|
||||||
* the OnDying deal with the consequences
|
* the OnDying deal with the consequences
|
||||||
|
|||||||
@@ -1,4 +1,27 @@
|
|||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
//::
|
||||||
|
//:: prc_shadolord.nss
|
||||||
|
//::
|
||||||
|
//:: Handles Shadow Sight & Shadow Blur
|
||||||
|
//::
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
//::
|
||||||
|
//:: Created by: Jaysyn
|
||||||
|
//:: Date: 2026-05-28 13:54:50
|
||||||
|
//::
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
//::
|
||||||
|
//:: Shadow Sight - Gains Darkvision and Ultravision in
|
||||||
|
//:: darkness.
|
||||||
|
//::
|
||||||
|
//:: Shadow Blur - In darkness gains the benefit of Blur
|
||||||
|
//;: spell (20% concealment at night or in
|
||||||
|
//:: a Darkness spell).
|
||||||
|
//::
|
||||||
|
//:: Shadow Discorporation - When reduced to 0 or fewer HP,
|
||||||
|
//:: (NOT IMPLEMENTED) has a chance to teleport away.
|
||||||
|
//::
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
#include "prc_feat_const"
|
#include "prc_feat_const"
|
||||||
#include "prc_class_const"
|
#include "prc_class_const"
|
||||||
#include "prc_spell_const"
|
#include "prc_spell_const"
|
||||||
@@ -36,18 +59,50 @@ void Discorp(object oPC,int iEquip)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
|
|
||||||
//Declare main variables.
|
//:: Declare main variables.
|
||||||
object oPC = OBJECT_SELF;
|
object oPC = OBJECT_SELF;
|
||||||
object oSkin = GetPCSkin(oPC);
|
object oSkin = GetPCSkin(oPC);
|
||||||
|
object oArea = GetArea(oPC);
|
||||||
|
|
||||||
int bDiscor= GetHasFeat(FEAT_SHADOWDISCOPOR, oPC) ? 1 : 0;
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oPC);
|
||||||
|
int nNight = !GetIsDay();
|
||||||
|
int nTopside = GetIsAreaAboveGround(oArea);
|
||||||
|
int nOutside = !GetIsAreaInterior(oArea);
|
||||||
|
|
||||||
if (GetLocalInt(oPC,"ONENTER")) return;
|
effect eLink;
|
||||||
if (bDiscor>0) Discorp(oPC,GetLocalInt(oPC,"ONEQUIP"));
|
effect eVis;
|
||||||
|
|
||||||
|
if (iShadow && nNight && nTopside && nOutside)
|
||||||
|
{
|
||||||
|
//:: Create visual feedback effect link
|
||||||
|
eVis = EffectVisualEffect(VFX_DUR_ULTRAVISION);
|
||||||
|
eVis = EffectLinkEffects(eVis, EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE));
|
||||||
|
eVis = EffectLinkEffects(eVis, EffectVisualEffect(VFX_DUR_MAGICAL_SIGHT));
|
||||||
|
eVis = EffectLinkEffects(eVis, EffectIcon(EFFECT_ICON_ULTRAVISION));
|
||||||
|
|
||||||
|
//:: Link Ultravision and visual feedback into base effect
|
||||||
|
eLink = EffectLinkEffects(eLink, EffectUltravision());
|
||||||
|
eLink = EffectLinkEffects(eLink, eVis);
|
||||||
|
if(DEBUG) DoDebug("prc_shadowlord >> Setting up Ultravision");
|
||||||
|
|
||||||
|
if (iShadow > 1)
|
||||||
|
{
|
||||||
|
//;: Add concealment for level 2+ Shadowlords
|
||||||
|
eLink = EffectLinkEffects(eLink, EffectConcealment(20));
|
||||||
|
if(DEBUG) DoDebug("prc_shadowlord >> Setting up Concealment");
|
||||||
|
}
|
||||||
|
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, 6.0f);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Shadow Discorporation was never finished
|
||||||
|
/* int bDiscor= GetHasFeat(FEAT_SHADOWDISCOPOR, oPC) ? 1 : 0;
|
||||||
|
|
||||||
|
if (GetLocalInt(oPC,"ONENTER")) return;
|
||||||
|
if (bDiscor>0) Discorp(oPC,GetLocalInt(oPC,"ONEQUIP")); */
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -42,10 +42,14 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
|||||||
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
if (iShadow)
|
if (iShadow)
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectUltravision(), oTarget,0.0f,FALSE);
|
{
|
||||||
if (iShadow>1)
|
ePnP = ShadowlordEffects(iShadow, ePnP);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectConcealment(20), oTarget,0.0f,FALSE);
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink2 = ShadowlordEffects(iShadow, eLink2);
|
||||||
|
ePnP = TagEffect(ePnP, "SHADOWSIGHT+BLUR");
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
eLink2 = TagEffect(eLink2, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
int nDuration = PRCGetCasterLevel(OBJECT_SELF);
|
int nDuration = PRCGetCasterLevel(OBJECT_SELF);
|
||||||
//Enter Metamagic conditions
|
//Enter Metamagic conditions
|
||||||
@@ -87,8 +91,9 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
|||||||
else if (oTarget == GetAreaOfEffectCreator())
|
else if (oTarget == GetAreaOfEffectCreator())
|
||||||
{
|
{
|
||||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE));
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE));
|
||||||
//Fire cast spell at event for the specified target
|
if (iShadow)
|
||||||
if(GetPRCSwitch(PRC_PNP_DARKNESS))
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink2, oTarget,0.0f,FALSE);
|
||||||
|
else if(GetPRCSwitch(PRC_PNP_DARKNESS))
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, ePnP, oTarget,0.0f,FALSE);
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, ePnP, oTarget,0.0f,FALSE);
|
||||||
else
|
else
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink2, oTarget,0.0f,FALSE);
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink2, oTarget,0.0f,FALSE);
|
||||||
@@ -100,6 +105,3 @@ DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|||||||
// Getting rid of the local integer storing the spellschool name
|
// Getting rid of the local integer storing the spellschool name
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,12 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
|||||||
effect eEffect = GetFirstEffect(oTarget);
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
while(GetIsEffectValid(eEffect))
|
while(GetIsEffectValid(eEffect))
|
||||||
{
|
{
|
||||||
|
if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
if(DEBUG) DoDebug("sp_blacklightb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
if(GetEffectTag(eEffect) == "PNP_DARKNESS")
|
if(GetEffectTag(eEffect) == "PNP_DARKNESS")
|
||||||
RemoveEffect(oTarget, eEffect);
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
|
||||||
@@ -71,6 +77,7 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
|||||||
eEffect = GetNextEffect(oTarget);
|
eEffect = GetNextEffect(oTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||||
// Getting rid of the local integer storing the spellschool name
|
// Getting rid of the local integer storing the spellschool name
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,26 @@
|
|||||||
|
//::///////////////////////////////////////////////
|
||||||
|
//:: Blacklight
|
||||||
|
//:: sp_blacklight.nss
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
/*
|
||||||
|
You create an area of total darkness.
|
||||||
|
|
||||||
|
The darkness is impenetrable to normal vision
|
||||||
|
and darkvision, but you can see normally within
|
||||||
|
the blacklit area. Creatures outside the
|
||||||
|
spell's area, even you, cannot see through it.
|
||||||
|
You can cast the spell on a point in space, but
|
||||||
|
the effect is stationary unless you cast it cast
|
||||||
|
on a mobile object. You can cast the spell on a
|
||||||
|
creature, and the effect then radiates from the
|
||||||
|
creature and moves as it moves. Unattended
|
||||||
|
objects and points in space do not get saving
|
||||||
|
throws or benefit from spell resistance.
|
||||||
|
|
||||||
|
Blacklight counters or dispels any light spell
|
||||||
|
of equal or lower level, such as daylight.
|
||||||
|
*/
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
|
||||||
#include "prc_inc_spells"
|
#include "prc_inc_spells"
|
||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
@@ -46,5 +69,4 @@ void main()
|
|||||||
SetAllAoEInts(SPELL_BLACKLIGHT, oAoE, PRCGetSpellSaveDC(SPELL_BLACKLIGHT, SPELL_SCHOOL_EVOCATION), 0, nCastLvl);
|
SetAllAoEInts(SPELL_BLACKLIGHT, oAoE, PRCGetSpellSaveDC(SPELL_BLACKLIGHT, SPELL_SCHOOL_EVOCATION), 0, nCastLvl);
|
||||||
|
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,15 +1,28 @@
|
|||||||
//::///////////////////////////////////////////////
|
//::///////////////////////////////////////////////
|
||||||
//:: Darkness: On Enter
|
//:: Blacklight: On Enter
|
||||||
//:: NW_S0_DarknessA.nss
|
//:: sp_blacklighta.nss
|
||||||
//:: Copyright (c) 2001 Bioware Corp.
|
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
/*
|
/*
|
||||||
Creates a globe of darkness around those in the area
|
You create an area of total darkness.
|
||||||
of effect.
|
|
||||||
|
The darkness is impenetrable to normal vision
|
||||||
|
and darkvision, but you can see normally within
|
||||||
|
the blacklit area. Creatures outside the
|
||||||
|
spell's area, even you, cannot see through it.
|
||||||
|
You can cast the spell on a point in space, but
|
||||||
|
the effect is stationary unless you cast it cast
|
||||||
|
on a mobile object. You can cast the spell on a
|
||||||
|
creature, and the effect then radiates from the
|
||||||
|
creature and moves as it moves. Unattended
|
||||||
|
objects and points in space do not get saving
|
||||||
|
throws or benefit from spell resistance.
|
||||||
|
|
||||||
|
Blacklight counters or dispels any light spell
|
||||||
|
of equal or lower level, such as daylight.
|
||||||
*/
|
*/
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
//:: Created By: Preston Watamaniuk
|
//:: Created By: Jaysyn
|
||||||
//:: Created On: Feb 28, 2002
|
//:: Created On: 2026-05-28 12:07:02
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
#include "prc_inc_spells"
|
#include "prc_inc_spells"
|
||||||
@@ -22,9 +35,10 @@ void main()
|
|||||||
effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
|
effect eInvis = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
|
||||||
effect eInvis2 = EffectInvisibility(INVISIBILITY_TYPE_IMPROVED);
|
effect eInvis2 = EffectInvisibility(INVISIBILITY_TYPE_IMPROVED);
|
||||||
effect eDarkv = EffectUltravision();
|
effect eDarkv = EffectUltravision();
|
||||||
effect eCounc=EffectConcealment(50);
|
effect eCounc = EffectConcealment(20);
|
||||||
effect eDark = EffectDarkness();
|
effect eDark = EffectDarkness();
|
||||||
effect eBlind = EffectBlindness();
|
effect eBlind = EffectBlindness();
|
||||||
|
|
||||||
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
||||||
effect eLink = EffectLinkEffects(eDark, eDur);
|
effect eLink = EffectLinkEffects(eDark, eDur);
|
||||||
eLink = EffectLinkEffects(eLink, eBlind);
|
eLink = EffectLinkEffects(eLink, eBlind);
|
||||||
@@ -35,32 +49,31 @@ void main()
|
|||||||
eLink2 = EffectLinkEffects(eLink2,eCounc);
|
eLink2 = EffectLinkEffects(eLink2,eCounc);
|
||||||
|
|
||||||
object oTarget = GetEnteringObject();
|
object oTarget = GetEnteringObject();
|
||||||
|
|
||||||
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
if (iShadow)
|
if (iShadow)
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectUltravision(), oTarget,0.0f,FALSE);
|
{
|
||||||
if (iShadow>1)
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectConcealment(20), oTarget,0.0f,FALSE);
|
eLink2 = ShadowlordEffects(iShadow, eLink2);
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
eLink2 = TagEffect(eLink2, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
if(GetIsObjectValid(oTarget) && oTarget != GetAreaOfEffectCreator())
|
if(GetIsObjectValid(oTarget) && oTarget != GetAreaOfEffectCreator())
|
||||||
{
|
{
|
||||||
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, GetAreaOfEffectCreator()))
|
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, GetAreaOfEffectCreator()))
|
||||||
{
|
{
|
||||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_DARKNESS));
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_BLACKLIGHT));
|
||||||
//Make SR Check
|
//Make SR Check
|
||||||
if (!PRCDoResistSpell(OBJECT_SELF, oTarget,SPGetPenetrAOE(GetAreaOfEffectCreator())))
|
if (!PRCDoResistSpell(OBJECT_SELF, oTarget,SPGetPenetrAOE(GetAreaOfEffectCreator())))
|
||||||
{
|
{
|
||||||
if (!iShadow)
|
|
||||||
//Fire cast spell at event for the specified target
|
//Fire cast spell at event for the specified target
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_DARKNESS, FALSE));
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_BLACKLIGHT, FALSE));
|
||||||
if (!iShadow)
|
|
||||||
//Fire cast spell at event for the specified target
|
//Fire cast spell at event for the specified target
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ void main()
|
|||||||
{
|
{
|
||||||
int nID = GetEffectSpellId(eAOE);
|
int nID = GetEffectSpellId(eAOE);
|
||||||
|
|
||||||
if( nID== SPELL_UR_BLACKLIGHT)
|
if( nID== SPELL_BLACKLIGHT)
|
||||||
{
|
{
|
||||||
if (GetEffectCreator(eAOE) == oCreator)
|
if (GetEffectCreator(eAOE) == oCreator)
|
||||||
RemoveEffect(oTarget, eAOE);
|
RemoveEffect(oTarget, eAOE);
|
||||||
@@ -27,6 +27,17 @@ void main()
|
|||||||
eAOE = GetNextEffect(oTarget);
|
eAOE = GetNextEffect(oTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
|
while(GetIsEffectValid(eEffect))
|
||||||
|
{
|
||||||
|
if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
if(DEBUG) DoDebug("sp_blacklightb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
eEffect = GetNextEffect(oTarget);
|
||||||
|
}
|
||||||
|
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,16 @@ void main()
|
|||||||
fDuration = fDuration *2; //Duration is +100%
|
fDuration = fDuration *2; //Duration is +100%
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
|
if (iShadow)
|
||||||
|
{
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLinkConf = TagEffect(eLinkConf, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
// * July 2003: If has darkness then do not put it on it again
|
// * July 2003: If has darkness then do not put it on it again
|
||||||
// Primogenitor: Yes, what about overlapping darkness effects by different casters?
|
// Primogenitor: Yes, what about overlapping darkness effects by different casters?
|
||||||
//if (PRCGetHasEffect(EFFECT_TYPE_DARKNESS, oTarget) == TRUE)
|
//if (PRCGetHasEffect(EFFECT_TYPE_DARKNESS, oTarget) == TRUE)
|
||||||
|
|||||||
@@ -40,6 +40,16 @@ void main()
|
|||||||
//Get next effect on the target
|
//Get next effect on the target
|
||||||
eAOE = GetNextEffect(oTarget);
|
eAOE = GetNextEffect(oTarget);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
|
while(GetIsEffectValid(eEffect))
|
||||||
|
{
|
||||||
|
if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
if(DEBUG) DoDebug("sp_blacklightb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
eEffect = GetNextEffect(oTarget);
|
||||||
}
|
}
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,14 +65,20 @@ void main()
|
|||||||
ePnP = TagEffect(ePnP, "PNP35_DARKNESS");
|
ePnP = TagEffect(ePnP, "PNP35_DARKNESS");
|
||||||
}
|
}
|
||||||
|
|
||||||
object oTarget = GetEnteringObject();
|
|
||||||
object oPC = GetAreaOfEffectCreator();
|
object oPC = GetAreaOfEffectCreator();
|
||||||
|
|
||||||
|
object oTarget = GetEnteringObject();
|
||||||
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
if (iShadow)
|
if (iShadow)
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectUltravision(), oTarget,0.0f,FALSE);
|
{
|
||||||
if (iShadow>1)
|
ePnP = ShadowlordEffects(iShadow, ePnP);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectConcealment(20), oTarget,0.0f,FALSE);
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink2 = ShadowlordEffects(iShadow, eLink2);
|
||||||
|
ePnP = TagEffect(ePnP, "SHADOWSIGHT+BLUR");
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
eLink2 = TagEffect(eLink2, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
int nDuration = PRCGetCasterLevel(oPC);
|
int nDuration = PRCGetCasterLevel(oPC);
|
||||||
if ((nMetaMagic & METAMAGIC_EXTEND))
|
if ((nMetaMagic & METAMAGIC_EXTEND))
|
||||||
|
|||||||
@@ -73,5 +73,17 @@ void main()
|
|||||||
eAOE = GetNextEffect(oTarget);
|
eAOE = GetNextEffect(oTarget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
|
while(GetIsEffectValid(eEffect))
|
||||||
|
{
|
||||||
|
if(GetEffectTag(eEffect) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eEffect);
|
||||||
|
if(DEBUG) DoDebug("sp_damng_darkb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
eEffect = GetNextEffect(oTarget);
|
||||||
|
}
|
||||||
|
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
}
|
}
|
||||||
@@ -65,7 +65,17 @@ void main()
|
|||||||
//Spell Resist
|
//Spell Resist
|
||||||
if(!PRCDoResistSpell(oPC, oTarget, nCasterLvl + SPGetPenetr()))
|
if(!PRCDoResistSpell(oPC, oTarget, nCasterLvl + SPGetPenetr()))
|
||||||
{
|
{
|
||||||
//Saving Throw
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_EVIL))
|
||||||
|
{
|
||||||
|
//Poor, poor paladin. It's pathetic that you didn't make your save.
|
||||||
|
AdjustAlignment(oTarget, ALIGNMENT_EVIL, (100 + nGoodEvil), FALSE);
|
||||||
|
|
||||||
|
// Store expiration time and shift amount using persistent locals
|
||||||
|
SetPersistantLocalInt(oTarget, "MoralityUndone_Expire", FloatToInt(GetTimeSecond() + fDur));
|
||||||
|
SetPersistantLocalInt(oTarget, "MoralityUndone_ShiftAmount", (100 + nGoodEvil));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* //Saving Throw
|
||||||
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_EVIL))
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_EVIL))
|
||||||
{
|
{
|
||||||
//Poor, poor paladin. It's pathetic that you didn't make your save.
|
//Poor, poor paladin. It's pathetic that you didn't make your save.
|
||||||
@@ -74,7 +84,7 @@ void main()
|
|||||||
//Schedule restoration. This might be a problem if they were 100 before and
|
//Schedule restoration. This might be a problem if they were 100 before and
|
||||||
//improved their alignment any while evil. They might be restored to 85 instead.
|
//improved their alignment any while evil. They might be restored to 85 instead.
|
||||||
DelayCommand(fDur, AdjustAlignment(oTarget, ALIGNMENT_GOOD, (100 + nGoodEvil), FALSE));
|
DelayCommand(fDur, AdjustAlignment(oTarget, ALIGNMENT_GOOD, (100 + nGoodEvil), FALSE));
|
||||||
}
|
} */
|
||||||
}
|
}
|
||||||
|
|
||||||
//SPEvilShift(oPC);
|
//SPEvilShift(oPC);
|
||||||
|
|||||||
@@ -43,8 +43,21 @@ void main()
|
|||||||
|
|
||||||
effect eLink = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
|
effect eLink = EffectInvisibility(INVISIBILITY_TYPE_DARKNESS);
|
||||||
eLink = EffectLinkEffects(eLink, EffectUltravision());
|
eLink = EffectLinkEffects(eLink, EffectUltravision());
|
||||||
|
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_ULTRAVISION));
|
||||||
|
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE));
|
||||||
|
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_MAGICAL_SIGHT));
|
||||||
|
eLink = EffectLinkEffects(eLink, EffectIcon(EFFECT_ICON_ULTRAVISION));
|
||||||
effect eDark = EffectDarkness();
|
effect eDark = EffectDarkness();
|
||||||
|
|
||||||
|
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOWLORD, oTarget);
|
||||||
|
|
||||||
|
if (iShadow)
|
||||||
|
{
|
||||||
|
eLink = ShadowlordEffects(iShadow, eLink);
|
||||||
|
eLink = TagEffect(eLink, "SHADOWSIGHT+BLUR");
|
||||||
|
eDark = ShadowlordEffects(iShadow, eDark);
|
||||||
|
eDark = TagEffect(eDark, "SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
//if valid and not caster
|
//if valid and not caster
|
||||||
if(GetIsObjectValid(oTarget) && oTarget != oPC)
|
if(GetIsObjectValid(oTarget) && oTarget != oPC)
|
||||||
@@ -53,7 +66,18 @@ void main()
|
|||||||
{
|
{
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eDark, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eDark, oTarget);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (oTarget == oPC)
|
||||||
|
{
|
||||||
|
// Caster gets effects based on alignment
|
||||||
|
if(GetAlignmentGoodEvil(oTarget) != ALIGNMENT_EVIL)
|
||||||
|
{
|
||||||
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eDark, oTarget);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
||||||
|
|||||||
@@ -54,6 +54,12 @@ void main()
|
|||||||
RemoveEffect(oTarget, eAOE);
|
RemoveEffect(oTarget, eAOE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(GetEffectTag(eAOE) == "SHADOWSIGHT+BLUR")
|
||||||
|
{
|
||||||
|
RemoveEffect(oTarget, eAOE);
|
||||||
|
if(DEBUG) DoDebug("sp_utterdarkb >> Removing SHADOWSIGHT+BLUR");
|
||||||
|
}
|
||||||
|
|
||||||
//Get next effect on the target
|
//Get next effect on the target
|
||||||
eAOE = GetNextEffect(oTarget);
|
eAOE = GetNextEffect(oTarget);
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -8349,7 +8349,7 @@ CLASS FEATURES:
|
|||||||
Level
|
Level
|
||||||
1: Shadow Sight - Gains Darkvision and Ultravision in darkness.
|
1: Shadow Sight - Gains Darkvision and Ultravision in darkness.
|
||||||
Shadow Jump - Dimension Door once per day per class level
|
Shadow Jump - Dimension Door once per day per class level
|
||||||
2: Shadow Blur - In darkness gains the benefit of Blur spell (20 % concealment in the night, underground area or Darkness spell).
|
2: Shadow Blur - In darkness gains the benefit of Blur spell (20% concealment while above ground at night or in a Darkness spell).
|
||||||
4: Shadow Pounce - May make a full attack after teleporting
|
4: Shadow Pounce - May make a full attack after teleporting
|
||||||
5: Shadow Discorporation - When any damage reduces him to 0 or less, has a chance to use teleport.
|
5: Shadow Discorporation - When any damage reduces him to 0 or less, has a chance to use teleport.
|
||||||
6: Death Attack - gains a Death Attack +1d6.
|
6: Death Attack - gains a Death Attack +1d6.
|
||||||
@@ -18304,7 +18304,12 @@ Duration: 1 rd/lvl
|
|||||||
Additional Counter Spells: Daylight
|
Additional Counter Spells: Daylight
|
||||||
Save: Will negate or none
|
Save: Will negate or none
|
||||||
Spell Resistance: Yes or No (object)
|
Spell Resistance: Yes or No (object)
|
||||||
All creatures within the area of effect are shrouded in a haze of darkness which can only be pierced by you.</entry>
|
|
||||||
|
You create an area of total darkness.
|
||||||
|
|
||||||
|
The darkness is impenetrable to normal vision and darkvision, but you can see normally within the blacklit area. Creatures outside the spell's area, even you, cannot see through it. You can cast the spell on a point in space, but the effect is stationary unless you cast it cast on a mobile object. You can cast the spell on a creature, and the effect then radiates from the creature and moves as it moves. Unattended objects and points in space do not get saving throws or benefit from spell resistance.
|
||||||
|
|
||||||
|
Blacklight counters or dispels any light spell of equal or lower level, such as daylight.</entry>
|
||||||
<entry id="48326" lang="en" sex="m">Dark Bolt (all Bolt)</entry>
|
<entry id="48326" lang="en" sex="m">Dark Bolt (all Bolt)</entry>
|
||||||
<entry id="48327" lang="en" sex="m">Dark Bolt (1 Bolt/rnd)</entry>
|
<entry id="48327" lang="en" sex="m">Dark Bolt (1 Bolt/rnd)</entry>
|
||||||
<entry id="48328" lang="en" sex="m">Anti-Paladin</entry>
|
<entry id="48328" lang="en" sex="m">Anti-Paladin</entry>
|
||||||
@@ -56416,7 +56421,7 @@ REQUIREMENTS:
|
|||||||
Race: Dwarf.
|
Race: Dwarf.
|
||||||
Alignment: Any nonevil.
|
Alignment: Any nonevil.
|
||||||
Skills: Craft (armorsmithing) 8 ranks, Lore 2 ranks.
|
Skills: Craft (armorsmithing) 8 ranks, Lore 2 ranks.
|
||||||
Meldshaping: Ability to shape soulmelds
|
Meldshaping: Ability to shape soulmelds (requires a minimum of an 11 Constitution)
|
||||||
|
|
||||||
CLASS FEATURES:
|
CLASS FEATURES:
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user