Advertisement
Terrah

Untitled

Aug 5th, 2019
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.57 KB | None | 0 0
  1. #include "cmnsee_classes_includes"
  2. #include "cm_cmedic_inc"
  3. #include "pn_inc_wildsoul"
  4.  
  5. const int FEAT_CLERIC_LIFE_DOMAIN = 2653;
  6. const int FEAT_EMPOWER_HEALING = -1;
  7. const int FEAT_MAXIMIZE_HEALING = -1;
  8.  
  9. int GetHealingAmount(object oCaster, int nSpellTier, int nCasterLevel){
  10.  
  11.     float fHeal = IntToFloat(nCasterLevel);
  12.  
  13.     switch(nSpellTier){
  14.    
  15.         case SPELL_CURE_LIGHT_WOUNDS:
  16.             fHeal *= 2.0;
  17.             break;
  18.            
  19.         case SPELL_CURE_MODERATE_WOUNDS:
  20.             fHeal *= 3.0;
  21.             break;
  22.            
  23.         case SPELL_CURE_SERIOUS_WOUNDS:
  24.             fHeal *= 4.0;
  25.             break;
  26.            
  27.         case SPELL_CURE_CRITICAL_WOUNDS:
  28.             fHeal *= 5.0;
  29.             break;
  30.            
  31.         case SPELL_HEAL:
  32.             fHeal *= 10.0;
  33.             break;
  34.            
  35.         default:break;
  36.     }
  37.  
  38.     float fHealSkills = IntToFloat(GetSkillRank(SKILL_HEAL, oCaster));
  39.     float mod;
  40.    
  41.     if(GetHasFeat(FEAT_MAXIMIZE_HEALING, oCaster)){
  42.         fHealSkills /= 2.0;
  43.         mod = 1.33;
  44.     }
  45.     else if(GetHasFeat(FEAT_EMPOWER_HEALING, oCaster) || GetHasFeat(FEAT_CLERIC_LIFE_DOMAIN, oCaster)){
  46.         fHealSkills /= 3.0;
  47.         mod = 1.25;
  48.     }
  49.     else if(GetHasFeat(FEAT_AUGMENT_HEALING, oCaster)){
  50.         fHealSkills /= 4.0;
  51.         mod = 1.15;
  52.     }
  53.     else{
  54.         fHealSkills = 0.0;
  55.         mod = 1.0;
  56.     }
  57.    
  58.     return Ceil((fHeal + fHealSkills) * mod);
  59. }
  60.  
  61. void HealParty(object oCaster, effect eVfx, int iHeal, location lTarget)
  62. {
  63.     int healed = 0;
  64.     int nKicker         = GetLocalInt(oCaster, "HealingKicker");
  65.     int bWildSoul       = GetLocalInt(oCaster,"WSCASTING");
  66.    
  67.     //Heal Friendlies
  68.     object oArea = GetArea(oCaster);
  69.     object oParty = GetFirstObjectInShape(SHAPE_SPHERE, 35.0, lTarget);
  70.     while(GetIsObjectValid(oParty)){
  71.    
  72.         if(GetIsReactionTypeFriendly(oParty, oCaster) || GetIsReactionTypeNeutral(oParty, oCaster)){
  73.    
  74.             if (nKicker != 0)
  75.                 ApplyKicker(oCaster, oParty, nKicker);
  76.        
  77.             if(bWildSoul)
  78.                 DoInfiniteSpell(oCaster, oParty);
  79.                
  80.             ReportHealing(oCaster,oParty,iHeal);
  81.                
  82.             SignalEvent(oParty, EventSpellCastAt(oCaster, GetSpellId(), FALSE));
  83.             ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(iHeal),oParty);
  84.             ApplyEffectToObject(DURATION_TYPE_INSTANT,eVfx,oParty);
  85.         }
  86.         else if(GetRacialType(oParty) == RACIAL_TYPE_UNDEAD || GetSubRace(oParty) ==  RACIAL_SUBTYPE_UNDEAD){
  87.        
  88.             if(bWildSoul)
  89.                 DoInfiniteSpell(oCaster, oParty);
  90.        
  91.             SignalEvent(oParty, EventSpellCastAt(oCaster, GetSpellId()));
  92.             ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(iHeal,DAMAGE_TYPE_POSITIVE),oParty);
  93.             ApplyEffectToObject(DURATION_TYPE_INSTANT,eVfx,oParty);
  94.         }
  95.        
  96.         oParty = GetNextObjectInShape(SHAPE_SPHERE, 35.0, lTarget);
  97.     }
  98. }
  99.  
  100. void main()
  101. {
  102.     if (!X2PreSpellCastCode())
  103.     {
  104.         // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
  105.         return;
  106.     }
  107.  
  108.     object oPC          = OBJECT_SELF;
  109.     int nSpell          = GetSpellId();
  110.     object oTarget      = GetSpellTargetObject();
  111.     int nCasterLevel    = CMNSEE_GetCasterLevel(oPC);
  112.    
  113.     if(nSpell == 2016 || nSpell == 2055 || nSpell == 2030 || nSpell == 2056 || nSpell == 2075)
  114.     {
  115.         nCasterLevel = GetWSCasterLevel(oPC);
  116.     }
  117.  
  118.     int nKicker         = GetLocalInt(oPC, "HealingKicker");
  119.     int nSpellTier      = 0;
  120.     effect eVfx;
  121.        
  122.     switch(nSpell){
  123.    
  124.         case 33:
  125.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_minor");
  126.             nSpellTier = SPELL_CURE_MINOR_WOUNDS;
  127.             break;
  128.            
  129.         case 32:
  130.         case 80:
  131.         case 2016:
  132.         case 2055:
  133.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_light");
  134.             nSpellTier = SPELL_CURE_LIGHT_WOUNDS;
  135.             break;
  136.            
  137.         case 34:
  138.         case 891:
  139.         case 2030:
  140.         case 2075:
  141.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_moderate");
  142.             nSpellTier = SPELL_CURE_MODERATE_WOUNDS;
  143.             break;
  144.            
  145.         case 35:
  146.         case 894:
  147.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_serious");
  148.             nSpellTier = SPELL_CURE_SERIOUS_WOUNDS;
  149.             break;
  150.            
  151.         case 31:
  152.         case 897:
  153.         case 2056:
  154.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_critical");
  155.             nSpellTier = SPELL_CURE_CRITICAL_WOUNDS;
  156.             break;
  157.        
  158.         case 79: //heal
  159.         case 114: //Mass heal
  160.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_critical");
  161.             nSpellTier = SPELL_HEAL;
  162.             break;
  163.            
  164.         case 1382://Waves of Chi (use monk-level)
  165.             nCasterLevel = GetLevelByClass(CLASS_TYPE_MONK, oPC);
  166.         case 1421://Healing Aptitude (Cleric Life Domain)
  167.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_critical");
  168.             nSpellTier = SPELL_CURE_CRITICAL_WOUNDS;
  169.             break;
  170.            
  171.         default:
  172.             SendMessageToPC(oPC,"<i>Spell missing in switch-case: "+IntToString(nSpell)+"</i>");
  173.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_minor");
  174.             nSpellTier = SPELL_CURE_MINOR_WOUNDS;
  175.         break;
  176.     }
  177.        
  178.     int nHeal = GetHealingAmount(oPC, nSpellTier, nCasterLevel);
  179.    
  180.     if(nSpell == 80 || nSpell == 891 || nSpell == 894 || nSpell == 897 || nSpell == 2055 || nSpell == 2056 || nSpell == 2075 || nSpell == 114)
  181.     {  
  182.         HealParty( oPC, eVfx, nHeal, GetSpellTargetLocation());
  183.         SendMessageToPC(oPC,"<i>Healing party for: "+IntToString(nHeal)+"</i>");
  184.         return;
  185.     }
  186.    
  187.     if(GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD && GetSubRace(oTarget) != RACIAL_SUBTYPE_UNDEAD)
  188.     {
  189.         if (nKicker != 0) ApplyKicker(oPC, oTarget, nKicker);
  190.         ReportHealing(oPC,oTarget,nHeal);
  191.         SignalEvent(oTarget, EventSpellCastAt(oPC, GetSpellId(), FALSE));
  192.         ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectLinkEffects(EffectHeal(nHeal),eVfx),oTarget);
  193.         SendMessageToPC(oPC,"<i>Healing for: "+IntToString(nHeal)+"</i>");
  194.        
  195.         if(GetLocalInt(oPC,"WSCASTING"))
  196.             DoInfiniteSpell(oPC, oTarget);
  197.     }
  198.     else {
  199.         SignalEvent(oTarget, EventSpellCastAt(oPC, GetSpellId()));     
  200.         ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(nHeal,DAMAGE_TYPE_POSITIVE),oTarget);
  201.        
  202.         if(GetLocalInt(oPC,"WSCASTING"))
  203.             DoInfiniteSpell(oPC, oTarget);
  204.     }
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement