ArcEmu: [Applied]Spells With Spell_effect_interrupt_cast - ArcEmu

Jump to content

Toggle shoutbox Lastest Announcements

dfighter  : (07 December 2014 - 12:06 PM) Arcemu is in hibernation mode, please read http://arcemu.org/fo...showtopic=26903
dfighter  : (01 January 2013 - 05:56 PM) Arcemu wishes you all a happy new year!
Hasbro  : (12 September 2012 - 10:01 AM) Please excuse our outage from the web! Our web host had a major malfunction!
dfighter  : (01 September 2012 - 04:05 PM) Since the spam bots just don't want to stop, I've enabled admin verification when registering.
dfighter  : (23 January 2012 - 09:56 PM) Please note that from now on you will need to confirm your email on the wiki in order to edit it!
Hasbro  : (31 December 2011 - 12:50 PM) Happy New Years all!
Navid  : (26 December 2011 - 04:09 AM) Merry Christmas !!!!!! Happy holidays all :)
WAmadeus  : (24 December 2011 - 03:54 PM) Merry Christmas to all!
dfighter  : (24 December 2011 - 11:05 AM) The Arcemu team wishes y'all a Merry Christmukkah!
Hasbro  : (05 October 2011 - 12:53 PM) Looking for web designers for upcoming web related project. If you're interested in designing user interfaces contact me
dfighter  : (02 September 2011 - 03:47 PM) So who here wants vehicles in Arcemu? :P http://arcemu.org/fo...showtopic=25440
Hasbro  : (14 August 2011 - 03:25 PM) Join us on irc, grab an irc client and connect to irc.freenode.net join channel #arcemu /server irc.freenode.net:6667 /join #arcemu
jackpoz  : (03 August 2011 - 05:33 AM) to all Lua Engine (old one) users: please check http://arcemu.org/fo...showtopic=25274
Hasbro  : (20 May 2011 - 05:27 PM) Looking for people experienced with CMake configuration and setup! Contact me asap
Hasbro  : (15 May 2011 - 05:03 PM) ArcEmu is recruiting C++ programmers, contact Hasbro if interested.
paroxysm  : (03 May 2011 - 06:26 PM) Updated luabridge gossip example to describe the whole gossip creation process rather than just how to create menu. Gossip tutorial
paroxysm  : (23 April 2011 - 11:35 AM) Lua writers can refer to the Luabridge Tutorials section in the Wiki to learn how to write gossip code correctly.
Hasbro  : (20 April 2011 - 05:22 PM) Thank you for your continuous contribution of bug reports, we are working on them.
Hasbro  : (17 April 2011 - 03:20 AM) Please consider donating to support our bills. Donations can be sent using PayPal to donations@arcemu.org - Thank you for your support.
paroxysm  : (10 April 2011 - 12:43 AM) Refer to the Luabridge Tutorials section in the Wiki to learn the new syntax of luabridge.
Resize Shouts Area

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

[Applied]Spells With Spell_effect_interrupt_cast Issue #47.

#1 User is offline   Neo_mat 

  • drunken bear rider
  • PipPipPip
  • Group: Developers
  • Posts: 278
  • Joined: 07-June 08
  • Gender:Male
  • Server OS:Linux

Posted 07 December 2011 - 09:21 AM

General:
- Spells with SPELL_EFFECT_INTERRUPT_CAST are working properly now and locking out the school of interrupted spell for the set duration. Issue #47.
Thanks MesoX for pointing out about checks and TrinityCore for example.

From 15d6a45cf9f6f97c90db14ffed48a768ff63f1e9 Mon Sep 17 00:00:00 2001
From: Neo_mat <neomat.github@gmail.com>
Date: Wed, 7 Dec 2011 18:15:15 +0400
Subject: [PATCH] General: Spells with SPELL_EFFECT_INTERRUPT_CAST are working
 properly now and locking out the school of casted for the
 set duration. Issue #47.

---
 src/arcemu-world/SpellEffects.cpp |   73 +++++++++++++------------------------
 1 files changed, 26 insertions(+), 47 deletions(-)

diff --git a/src/arcemu-world/SpellEffects.cpp b/src/arcemu-world/SpellEffects.cpp
index e38af2d..a8ecdfb 100644
--- a/src/arcemu-world/SpellEffects.cpp
+++ b/src/arcemu-world/SpellEffects.cpp
@@ -3722,57 +3722,36 @@ void Spell::SpellEffectInterruptCast(uint32 i) // Interrupt Cast
 		}
 	}
 
-	uint32 school = 0;
-	uint32 prevtype = 0;
-	if(unitTarget->GetCurrentSpell())
-	{
-		prevtype = unitTarget->GetCurrentSpell()->GetProto()->PreventionType;
-
-		if((GetProto()->InterruptFlags & CAST_INTERRUPT_ON_INTERRUPT_SCHOOL) && (prevtype == PREVENTION_TYPE_SILENCE))
-		{
-			school = unitTarget->GetCurrentSpell()->GetProto()->School;
-		}
-
-		unitTarget->GetCurrentSpell()->cancel();
-	}
-
-	if(school)//prevent from casts in this school
-	{
-		int32 duration = GetDuration();
-		if(unitTarget->IsPlayer())
-		{
-			int32 DurationModifier = TO< Player* >(unitTarget)->MechanicDurationPctMod[MECHANIC_INTERRUPTED];
-			if(DurationModifier >= - 100)
-				duration = (duration * (100 + DurationModifier)) / 100;
-		}
-
-		unitTarget->SchoolCastPrevent[school] = duration + getMSTime();
-
-		if(unitTarget->IsPlayer())
+	Spell *TargetSpell = unitTarget->GetCurrentSpell(); // Get target's casting spell
+	if(TargetSpell)
+	{
+		uint32 school = TargetSpell->GetProto()->School; // Get target's casting spell school
+		int32 duration = GetDuration(); // Duration of school lockout
+
+		// Check for CastingTime (to prevent interrupting instant casts), PreventionType
+		// and InterruptFlags of target's casting spell
+		if(school
+			&& (TargetSpell->getState() == SPELL_STATE_CASTING
+			|| (TargetSpell->getState() == SPELL_STATE_PREPARING && TargetSpell->GetProto()->CastingTimeIndex > 0.0f))
+			&& TargetSpell->GetProto()->PreventionType == PREVENTION_TYPE_SILENCE
+			&& ((TargetSpell->GetProto()->InterruptFlags & CAST_INTERRUPT_ON_INTERRUPT_SCHOOL)
+			|| (TargetSpell->GetProto()->ChannelInterruptFlags & CHANNEL_INTERRUPT_ON_4 )))
 		{
-			TO_PLAYER(unitTarget)->SendPreventSchoolCast(school, duration);
-		}
-	}
-	else if((GetProto()->InterruptFlags & CAST_INTERRUPT_ON_INTERRUPT_ALL) && (prevtype == PREVENTION_TYPE_SILENCE))
-	{
-		int32 duration = GetDuration();
-
-		if(unitTarget->IsPlayer())
-		{
-			// Check for interruption reducing talents
-			int32 DurationModifier = TO< Player* >(unitTarget)->MechanicDurationPctMod[MECHANIC_INTERRUPTED];
-
-			if(DurationModifier >= - 100)
-				duration = (duration * (100 + DurationModifier)) / 100;
-		}
-
-		for(uint8 j = 0; j < 7; j++)
-		{
-			unitTarget->SchoolCastPrevent[j] = duration;
 			if(unitTarget->IsPlayer())
 			{
-				TO_PLAYER(unitTarget)->SendPreventSchoolCast(j, duration);
+				// Check for interruption reducing talents
+				int32 DurationModifier = TO< Player* >(unitTarget)->MechanicDurationPctMod[MECHANIC_INTERRUPTED];
+				if(DurationModifier >= - 100)
+					duration = (duration * (100 + DurationModifier)) / 100;
+
+				// Prevent player from casting in that school
+				TO_PLAYER(unitTarget)->SendPreventSchoolCast(school, duration);
 			}
+			else
+				// Prevent unit from casting in that school
+				unitTarget->SchoolCastPrevent[school] = duration + getMSTime();
+
+			TargetSpell->cancel(); // Interrupt the spell cast
 		}
 	}
 }
-- 
1.7.7.1.msysgit.0

Attached File(s)


Posted Image
Posted Image
Posted Image
I am 91% addicted to World of Warcraft. What about you?
0

#2 User is offline   salamanda 

  • Enthusiast
  • PipPipPip
  • Group: Members
  • Posts: 161
  • Joined: 10-July 08

Posted 27 December 2011 - 08:49 AM

Tested, working well. ;) Thanks.
0

#3 User is offline   dfighter 

  • Titles are overrated
  • PipPipPipPipPipPipPipPipPipPip
  • Group: Administrator
  • Posts: 5,189
  • Joined: 14-June 08
  • IRC:dfighter
  • Gender:Male
  • Server OS:Linux

Posted 25 January 2012 - 01:20 PM

- Applied.
- Moved to applied patches.
"The demand for free goods is infinite."
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users