Advertisement
Terrah

Untitled

Sep 10th, 2019
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.52 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, float fRadius)
  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, fRadius, lTarget);
  70.     while(GetIsObjectValid(oParty)){
  71.    
  72.         if((GetRacialType(oParty) == RACIAL_TYPE_UNDEAD || GetSubRace(oParty) ==  RACIAL_SUBTYPE_UNDEAD)){
  73.        
  74.             if(spellsIsTarget(oParty, SPELL_TARGET_STANDARDHOSTILE, oCaster) &&
  75.                GetDistanceBetweenLocations(lTarget, GetLocation(oParty)) <= RADIUS_SIZE_HUGE){
  76.                
  77.                 if(bWildSoul)
  78.                     DoInfiniteSpell(oCaster, oParty);
  79.        
  80.                 SignalEvent(oParty, EventSpellCastAt(oCaster, GetSpellId()));
  81.                 ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(iHeal,DAMAGE_TYPE_POSITIVE),oParty);
  82.                 ApplyEffectToObject(DURATION_TYPE_INSTANT,eVfx,oParty);
  83.             }
  84.        
  85.             //Do nothing for non hostile undeads
  86.         }
  87.         else if(spellsIsTarget(oParty, SPELL_TARGET_ALLALLIES, oCaster)){
  88.    
  89.             if (nKicker != 0)
  90.                 ApplyKicker(oCaster, oParty, nKicker);
  91.        
  92.             if(bWildSoul)
  93.                 DoInfiniteSpell(oCaster, oParty);
  94.                
  95.             ReportHealing(oCaster,oParty,iHeal);
  96.                
  97.             SignalEvent(oParty, EventSpellCastAt(oCaster, GetSpellId(), FALSE));
  98.             ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(iHeal),oParty);
  99.             ApplyEffectToObject(DURATION_TYPE_INSTANT,eVfx,oParty);
  100.         }
  101.        
  102.         oParty = GetNextObjectInShape(SHAPE_SPHERE, fRadius, lTarget);
  103.     }
  104. }
  105.  
  106. void main()
  107. {
  108.     if (!X2PreSpellCastCode())
  109.     {
  110.         // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
  111.         return;
  112.     }
  113.  
  114.     object oPC          = OBJECT_SELF;
  115.     int nSpell          = GetSpellId();
  116.     object oTarget      = GetSpellTargetObject();
  117.     int nCasterLevel    = CMNSEE_GetCasterLevel(oPC);
  118.     float fRadius = 35.0;
  119.    
  120.     if(nSpell == 2016 || nSpell == 2055 || nSpell == 2030 || nSpell == 2056 || nSpell == 2075)
  121.     {
  122.         nCasterLevel = GetWSCasterLevel(oPC);
  123.     }
  124.  
  125.     int nKicker         = GetLocalInt(oPC, "HealingKicker");
  126.     int nSpellTier      = 0;
  127.     effect eVfx;
  128.        
  129.     switch(nSpell){
  130.    
  131.         case 33:
  132.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_minor");
  133.             nSpellTier = SPELL_CURE_MINOR_WOUNDS;
  134.             break;
  135.            
  136.         case 32:
  137.         case 80:
  138.         case 2016:
  139.         case 2055:
  140.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_light");
  141.             nSpellTier = SPELL_CURE_LIGHT_WOUNDS;
  142.             break;
  143.            
  144.         case 34:
  145.         case 891:
  146.         case 2030:
  147.         case 2075:
  148.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_moderate");
  149.             nSpellTier = SPELL_CURE_MODERATE_WOUNDS;
  150.             break;
  151.            
  152.         case 35:
  153.         case 894:
  154.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_serious");
  155.             nSpellTier = SPELL_CURE_SERIOUS_WOUNDS;
  156.             break;
  157.            
  158.         case 31:
  159.         case 897:
  160.         case 2056:
  161.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_critical");
  162.             nSpellTier = SPELL_CURE_CRITICAL_WOUNDS;
  163.             break;
  164.        
  165.         case 1422: //rebuke death
  166.             if(!GetHasFeat(294,oPC,FALSE))
  167.             {  
  168.                 SendMessageToPC(oPC,"Out of turn undead charges!");
  169.                 return;
  170.             }      
  171.             DecrementRemainingFeatUses(oPC,294);
  172.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_critical");
  173.             nSpellTier = SPELL_HEAL;
  174.             fRadius = 15.0;
  175.             break;
  176.            
  177.         case 313: //Lay on hands
  178.             nCasterLevel = GetHighestDivineCasterClass(oPC,0) + GetLevelByClass(CLASS_TYPE_BLACKGUARD,oPC);
  179.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_critical");
  180.             nSpellTier = SPELL_HEAL;
  181.             fRadius = 15.0;
  182.             break;
  183.            
  184.         case 965: //War priest massheal
  185.             nCasterLevel = GetLevelByClass(CLASS_TYPE_WARPRIEST);
  186.         case 79: //heal
  187.         case 114: //Mass heal
  188.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_critical");
  189.             nSpellTier = SPELL_HEAL;
  190.             fRadius = 15.0;
  191.             break;
  192.            
  193.         case 1382://Waves of Chi (use monk-level)
  194.             nCasterLevel = GetLevelByClass(CLASS_TYPE_MONK, oPC);
  195.         case 1421://Healing Aptitude (Cleric Life Domain)
  196.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_critical");
  197.             nSpellTier = SPELL_CURE_CRITICAL_WOUNDS;
  198.             break;
  199.            
  200.         default:
  201.             SendMessageToPC(oPC,"<i>Spell missing in switch-case: "+IntToString(nSpell)+"</i>");
  202.             eVfx = EffectNWN2SpecialEffectFile("sp_cure_minor");
  203.             nSpellTier = SPELL_CURE_MINOR_WOUNDS;
  204.         break;
  205.     }
  206.        
  207.     int nHeal = GetHealingAmount(oPC, nSpellTier, nCasterLevel);
  208.    
  209.     if(nSpell == 80 || nSpell == 891 || nSpell == 894 || nSpell == 897 || nSpell == 2055 || nSpell == 2056 || nSpell == 2075 || nSpell == 114 || nSpell == 1422 || nSpell == 313 || nSpell == 965)
  210.     {  
  211.         HealParty( oPC, eVfx, nHeal, GetSpellTargetLocation(), fRadius);
  212.         SendMessageToPC(oPC,"<i>Healing party for: "+IntToString(nHeal)+"</i>");
  213.         return;
  214.     }
  215.    
  216.     if(GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD && GetSubRace(oTarget) != RACIAL_SUBTYPE_UNDEAD)
  217.     {
  218.         if (nKicker != 0) ApplyKicker(oPC, oTarget, nKicker);
  219.         ReportHealing(oPC,oTarget,nHeal);
  220.         SignalEvent(oTarget, EventSpellCastAt(oPC, GetSpellId(), FALSE));
  221.         ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectLinkEffects(EffectHeal(nHeal),eVfx),oTarget);
  222.         SendMessageToPC(oPC,"<i>Healing for: "+IntToString(nHeal)+"</i>");
  223.        
  224.         if(GetLocalInt(oPC,"WSCASTING"))
  225.             DoInfiniteSpell(oPC, oTarget);
  226.     }
  227.     else {
  228.         SignalEvent(oTarget, EventSpellCastAt(oPC, GetSpellId()));     
  229.         ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(nHeal,DAMAGE_TYPE_POSITIVE),oTarget);
  230.        
  231.         if(GetLocalInt(oPC,"WSCASTING"))
  232.             DoInfiniteSpell(oPC, oTarget);
  233.     }
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement