All pastes #1011100 Raw Edit

Untitled

public text v1 · immutable
#1011100 ·published 2008-05-07 21:14 UTC
rendered paste body
Index: src/ascent-world/Object.cpp
===================================================================
--- src/ascent-world/Object.cpp	(revision 4541)
+++ src/ascent-world/Object.cpp	(working copy)
@@ -46,6 +46,8 @@
 	m_flySpeed = 7.0f;
 	m_backFlySpeed = 4.5f;
 
+	m_mountSpeed = 7.0f;
+
 	m_backWalkSpeed = 4.5f;	// this should really be named m_backRunSpeed
 	m_swimSpeed = 4.722222f;
 	m_backSwimSpeed = 2.5f;
Index: src/ascent-world/Object.h
===================================================================
--- src/ascent-world/Object.h	(revision 4541)
+++ src/ascent-world/Object.h	(working copy)
@@ -454,6 +454,8 @@
 	float m_backSwimSpeed;
 	float m_turnRate;
 	float m_flySpeed;
+	float m_mountSpeed;
+	float m_lastMountSpeed;
 	float m_backFlySpeed;
 
 	float m_base_runSpeed;
Index: src/ascent-world/Player.cpp
===================================================================
--- src/ascent-world/Player.cpp	(revision 4541)
+++ src/ascent-world/Player.cpp	(working copy)
@@ -3776,43 +3776,39 @@
 		SendMessageToSet(&data, true);
 }
 
-void Player::SetPlayerSpeed(uint8 SpeedType, float value)
+void Player::AddPlayerSpeed(uint8 SpeedType, float value)
 {
-	/*WorldPacket data(18);
-	data << GetNewGUID();
-	data << m_speedChangeCounter++;
-	
-	if(SpeedType == RUN)			// nfi what this is.. :/
-		data << uint8(1);
+	//sLog.outString("AddPlayerSpeed(%u,%f)", SpeedType, value);
+	if(SpeedType == RUN)
+		SetPlayerSpeed(SpeedType, m_runSpeed + value);
 
-	data << value;*/
-	WorldPacket data(50);
-	/*if(SpeedType==FLY)
-	{
-		data << GetNewGUID();
-		data << m_speedChangeCounter++;
+	if(SpeedType == SWIM)
+		SetPlayerSpeed(SpeedType, m_swimSpeed + value);
 
-		if(SpeedType == RUN)			// nfi what this is.. :/
-			data << uint8(1);
+	if(SpeedType == FLY)
+		SetPlayerSpeed(SpeedType, m_flySpeed + value);
 
-		data << value;
+	if(SpeedType == MOUNT)
+		SetPlayerSpeed(SpeedType, m_mountSpeed + value);
+
+	if(SpeedType == ALL)
+	{
+		AddPlayerSpeed(RUN, value);
+		AddPlayerSpeed(SWIM, value);
+		AddPlayerSpeed(FLY, value);
+		AddPlayerSpeed(MOUNT, value);
 	}
-	else
-	{
-		data << GetNewGUID();
-		data << uint32(0);
-		data << uint8(0);
-		data << uint32(getMSTime());
-		data << GetPosition();
-		data << m_position.o;
-		data << uint32(0);
-		data << value;
-	}*/
+}
+
+void Player::SetPlayerSpeed(uint8 SpeedType, float value)
+{
+	//sLog.outString("SetPlayerSpeed(%u,%f)", SpeedType, value);
+	WorldPacket data(50);
 	if( SpeedType != SWIMBACK )
 	{
 		data << GetNewGUID();
 		data << m_speedChangeCounter++;
-		if( SpeedType == RUN )
+		if( SpeedType == RUN || SpeedType == MOUNT )
 			data << uint8(1);
 
 		data << value;
@@ -3840,6 +3836,13 @@
 			m_runSpeed = value;
 			m_lastRunSpeed = value;
 		}break;
+	case MOUNT:
+		{
+			if(value == m_lastMountSpeed) return;
+			data.SetOpcode(SMSG_FORCE_RUN_SPEED_CHANGE);
+			m_mountSpeed = value;
+			m_lastMountSpeed = value;
+		}break;
 	case RUNBACK:
 		{
 			if(value == m_lastRunBackSpeed)
@@ -10285,7 +10288,13 @@
 		}*/
 
 		// simplified; just take the fastest speed. less chance of fuckups too
-		float speed = ( flying_aura ) ? m_flySpeed : ( m_swimSpeed > m_runSpeed ) ? m_swimSpeed : m_runSpeed;
+		float speed = (m_swimSpeed > m_runSpeed) ? m_swimSpeed : m_runSpeed;
+		if(flying_aura && m_flySpeed > speed)
+			speed = m_flySpeed;
+
+		if(IsMounted() && m_mountSpeed > speed)
+			speed = m_mountSpeed;
+
 		if( speed != _lastHeartbeatV )
 		{
 			if( m_isMoving )
Index: src/ascent-world/Player.h
===================================================================
--- src/ascent-world/Player.h	(revision 4541)
+++ src/ascent-world/Player.h	(working copy)
@@ -138,6 +138,9 @@
     SWIMBACK        = 4,
     WALK	        = 5,
     FLY	            = 6,
+	MOUNT			= 7,
+	NUM_SPEEDS		= 8,
+	ALL				= 0xFF,
 };
 
 enum Standing
@@ -1105,6 +1108,7 @@
     /* Movement system                                                      */
     /************************************************************************/
 	void SetMovement(uint8 pType, uint32 flag);
+	void AddPlayerSpeed(uint8 SpeedType, float value);
 	void SetPlayerSpeed(uint8 SpeedType, float value);
 	float GetPlayerSpeed(){return m_runSpeed;}
 	uint8 m_currentMovement;
Index: src/ascent-world/SpellAuras.cpp
===================================================================
--- src/ascent-world/SpellAuras.cpp	(revision 4541)
+++ src/ascent-world/SpellAuras.cpp	(working copy)
@@ -308,7 +308,40 @@
 		}
 	}
 }*/
+#define QUICKCALC \
+	(mod->m_amount / 100.0f)
+void Aura::CalcSpeedMod(uint32 type)
+{
+	switch(type)
+	{
+	case RUN:
+		m_speedMod[RUN] = m_target->m_runSpeed * QUICKCALC;
+		//sLog.outString("Spell Mod RUN calculated to be: %f", m_speedMod[RUN]);
+		break;
 
+	case SWIM:
+		m_speedMod[SWIM] = m_target->m_swimSpeed * QUICKCALC;
+		break;
+
+	case MOUNT:
+		m_speedMod[MOUNT] = m_target->m_mountSpeed * QUICKCALC;
+		//sLog.outString("Spell Mod MOUNT calculated to be: %f", m_speedMod[MOUNT]);
+		break;
+
+	case FLY:
+		m_speedMod[FLY] = m_target->m_flySpeed * QUICKCALC;
+		break;
+	}
+
+	if(type == ALL) // Mehhhh
+	{
+		CalcSpeedMod(RUN);
+		CalcSpeedMod(FLY);
+		CalcSpeedMod(MOUNT);
+		CalcSpeedMod(SWIM);
+	}
+}
+
 Unit* Aura::GetUnitCaster()
 {
 	if( !m_target )
@@ -467,7 +500,7 @@
 
 	m_target->m_auras[m_auraSlot] = NULL;
 
-	if( GetSpellProto()->SpellGroupType && m_target->GetTypeId() == TYPEID_PLAYER )
+	/*if( GetSpellProto()->SpellGroupType && m_target->GetTypeId() == TYPEID_PLAYER )
 	{
 		int32 speedmod = 0;
 		SM_FIValue( m_target->SM_FSpeedMod, &speedmod, m_spellProto->SpellGroupType );
@@ -476,7 +509,7 @@
 			m_target->m_speedModifier -= speedmod;
 			m_target->UpdateSpeed();
 		}
-	}
+	}*/
 
 	// remove attacker
 	Unit* caster = GetUnitCaster();
@@ -3369,11 +3402,14 @@
 void Aura::SpellAuraModIncreaseSpeed(bool apply)
 {
 	if(apply)
-		m_target->m_speedModifier += mod->m_amount;
+	{
+		CalcSpeedMod(RUN);
+		m_target->UpdateSpeedFromAura(this, RUN, true);
+	}
 	else
-		m_target->m_speedModifier -= mod->m_amount;
-
-	m_target->UpdateSpeed();
+	{
+		m_target->UpdateSpeedFromAura(this, RUN, false);
+	}
 }
 
 void Aura::SpellAuraModIncreaseMountedSpeed(bool apply)
@@ -3381,11 +3417,12 @@
 	if(apply)
 	{ 
 		SetPositive();
-		m_target->m_mountedspeedModifier += mod->m_amount;
+		CalcSpeedMod(MOUNT);
+		m_target->UpdateSpeedFromAura(this, MOUNT, true);
 	}
 	else
-		m_target->m_mountedspeedModifier -= mod->m_amount;
-	m_target->UpdateSpeed();
+		m_target->UpdateSpeedFromAura(this, MOUNT, false);
+
 }
 
 void Aura::SpellAuraModCreatureRangedAttackPower(bool apply)
@@ -3415,48 +3452,21 @@
 
 void Aura::SpellAuraModDecreaseSpeed(bool apply)
 {
-	//there can not be 2 slow downs only most powerfull is applied
 	if(apply)
 	{
-		switch(m_spellProto->NameHash)
-		{
-			case 0x1931b37a:			// Stealth
-				SetPositive();
-				break;
-
-			case 0x25dab9ca:			// Dazed
-				SetNegative();
-				break;
-
-			default:
-				/* burlex: this would be better as a if(caster is hostile to target) then effect = negative) */
-				if(m_casterGuid != m_target->GetGUID())
-					SetNegative();
-				break;
-		}
-
-		//let's check Mage talents if we proc anythig 
-		if(m_spellProto->School==SCHOOL_FROST)
-		{
-			Unit *caster=GetUnitCaster();
-			//yes we are freezing the bastard, so can we proc anything on this ?
-			if(caster && caster->IsPlayer() && m_target)
-				static_cast< Player* >(caster)->EventStunOrImmobilize(m_target);
-		}
-		m_target->speedReductionMap.insert(make_pair(m_spellProto->Id, mod->m_amount));
-		//m_target->m_slowdown=this;
-		//m_target->m_speedModifier += mod->m_amount;
+		CalcSpeedMod(RUN);
+		CalcSpeedMod(FLY);
+		CalcSpeedMod(MOUNT);
+		m_target->UpdateSpeedFromAura(this, RUN, true);
+		m_target->UpdateSpeedFromAura(this, FLY, true);
+		m_target->UpdateSpeedFromAura(this, MOUNT, true);
 	}
 	else
 	{
-		map< uint32, int32 >::iterator itr = m_target->speedReductionMap.find(m_spellProto->Id);
-		if(itr != m_target->speedReductionMap.end())
-			m_target->speedReductionMap.erase(itr);
-		//m_target->m_speedModifier -= mod->m_amount;
-		//m_target->m_slowdown=NULL;
+		m_target->UpdateSpeedFromAura(this, RUN, false);
+		m_target->UpdateSpeedFromAura(this, FLY, false);
+		m_target->UpdateSpeedFromAura(this, MOUNT, false);
 	}
-	if(m_target->GetSpeedDecrease())
-		m_target->UpdateSpeed();
 
 }
 
@@ -4534,19 +4544,12 @@
 {   
 	if(apply)
 	{
+		CalcSpeedMod(SWIM);
 		if(m_target->isAlive())  SetPositive(); 
-		m_target->m_swimSpeed = 0.04722222f*(100+mod->m_amount);
+		m_target->UpdateSpeedFromAura(this, SWIM, true);
 	}
 	else 
-		m_target->m_swimSpeed = PLAYER_NORMAL_SWIM_SPEED;
-	if(m_target->GetTypeId() == TYPEID_PLAYER)
-	{
-		WorldPacket data(SMSG_FORCE_SWIM_SPEED_CHANGE, 17);
-		data << m_target->GetNewGUID();
-		data << (uint32)2;
-		data << m_target->m_swimSpeed;
-		static_cast< Player* >( m_target )->GetSession()->SendPacket(&data);
-	}   
+		m_target->UpdateSpeedFromAura(this, SWIM, false);
 }
 
 void Aura::SpellAuraModCratureDmgDone(bool apply)
@@ -6297,13 +6300,12 @@
 {
 	if(apply)
 	{  
+		CalcSpeedMod(RUN);
 		SetPositive();
-		m_target->m_speedModifier += mod->m_amount;
+		m_target->UpdateSpeedFromAura(this, RUN, true);
 	}
 	else
-		m_target->m_speedModifier -= mod->m_amount;
-
-	m_target->UpdateSpeed();
+		m_target->UpdateSpeedFromAura(this, RUN, false);
 }
 
 void Aura::SpellAuraModIncreaseEnergyPerc( bool apply )
@@ -6895,13 +6897,13 @@
 	{
 		if(apply)
 		{
-			m_target->m_speedModifier += mod->m_amount;
+			CalcSpeedMod(RUN);
+			m_target->UpdateSpeedFromAura(this, RUN, true);
 		}
 		else
 		{
-			m_target->m_speedModifier -= mod->m_amount;
+			m_target->UpdateSpeedFromAura(this, RUN, false);
 		}
-		m_target->UpdateSpeed();
 	}
 }
 
@@ -7514,9 +7516,9 @@
 {
 	if(apply)
 	{
+		CalcSpeedMod(FLY);
 		m_target->EnableFlight();
-		m_target->m_flyspeedModifier += mod->m_amount;
-		m_target->UpdateSpeed();
+		m_target->UpdateSpeedFromAura(this, FLY, true);
 		if(m_target->IsPlayer())
 		{
 			static_cast< Player* >( m_target )->flying_aura = m_spellProto->Id;
@@ -7525,8 +7527,7 @@
 	else
 	{
 		m_target->DisableFlight();
-		m_target->m_flyspeedModifier -= mod->m_amount;
-		m_target->UpdateSpeed();
+		m_target->UpdateSpeedFromAura(this, FLY, false);
 		if(m_target->IsPlayer())
 		{
 			static_cast< Player* >( m_target )->flying_aura = 0;
@@ -7539,9 +7540,9 @@
 	// Used in flight form (only so far)
 	if(apply)
 	{
+		CalcSpeedMod(FLY);
 		m_target->EnableFlight();
-		m_target->m_flyspeedModifier += mod->m_amount;
-		m_target->UpdateSpeed();
+		m_target->UpdateSpeedFromAura(this, FLY, true);
 		if(m_target->IsPlayer())
 		{
 			static_cast< Player* >( m_target )->flying_aura = m_spellProto->Id;
@@ -7550,8 +7551,7 @@
 	else
 	{
 		m_target->DisableFlight();
-		m_target->m_flyspeedModifier -= mod->m_amount;
-		m_target->UpdateSpeed();
+		m_target->UpdateSpeedFromAura(this, FLY, false);
 		if(m_target->IsPlayer())
 		{
 			static_cast< Player* >( m_target )->flying_aura = 0;
@@ -7562,19 +7562,28 @@
 void Aura::SpellAuraIncreaseMovementAndMountedSpeed( bool apply )
 {
 	if( apply )
-		m_target->m_mountedspeedModifier += mod->m_amount;
+	{
+		CalcSpeedMod(FLY);
+		CalcSpeedMod(MOUNT);
+		m_target->UpdateSpeedFromAura(this, RUN, true);
+		m_target->UpdateSpeedFromAura(this, MOUNT, true);
+	}
 	else
-		m_target->m_mountedspeedModifier -= mod->m_amount;
-	m_target->UpdateSpeed();
+	{
+		m_target->UpdateSpeedFromAura(this, RUN, false);
+		m_target->UpdateSpeedFromAura(this, MOUNT, false);
+	}
 }
 
 void Aura::SpellAuraIncreaseFlightSpeed( bool apply )
 {
 	if( apply )
-		m_target->m_flyspeedModifier += mod->m_amount;
+	{
+		CalcSpeedMod(FLY);
+		m_target->UpdateSpeedFromAura(this, FLY, true);
+	}
 	else
-		m_target->m_flyspeedModifier -= mod->m_amount;
-	m_target->UpdateSpeed();
+		m_target->UpdateSpeedFromAura(this, FLY, false);
 }
 
 
Index: src/ascent-world/SpellAuras.h
===================================================================
--- src/ascent-world/SpellAuras.h	(revision 4541)
+++ src/ascent-world/SpellAuras.h	(working copy)
@@ -651,6 +651,9 @@
 	uint8 m_visualSlot;
 	uint32 pSpellId; //this represents the triggering spell id
 
+	float m_speedMod[NUM_SPEEDS];
+	void CalcSpeedMod(uint32 type);
+
 	// this stuff can be cached in spellproto.
 	ASCENT_INLINE bool IsCombatStateAffecting()
 	{
Index: src/ascent-world/Unit.cpp
===================================================================
--- src/ascent-world/Unit.cpp	(revision 4541)
+++ src/ascent-world/Unit.cpp	(working copy)
@@ -4566,33 +4566,37 @@
     }
 }
 
-void Unit::UpdateSpeed()
+void Unit::UpdateSpeedFromAura(Aura * pAura, uint32 speedType, bool apply)
 {
-	if(GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID) == 0)
+	float mod = pAura->m_speedMod[speedType];
+	if(!apply)
+		mod = -mod;
+
+	//sLog.outString("UpdateSpeedFromAura(Aura, %u, %s) mod = %f", speedType, (apply) ? "true" : "false", mod);
+	if(IsPlayer())
 	{
-		if(IsPlayer())
-			m_runSpeed = m_base_runSpeed*(1.0f + ((float)m_speedModifier)/100.0f);
-		else
-			m_runSpeed = m_base_runSpeed*(1.0f + ((float)m_speedModifier)/100.0f);
+		static_cast<Player*>(this)->AddPlayerSpeed(speedType, mod);
+		return;
 	}
-	else
+	
+	switch(speedType)
 	{
-		if(IsPlayer())
-		{
-			m_runSpeed = m_base_runSpeed*(1.0f + ((float)m_mountedspeedModifier)/100.0f);
-			m_runSpeed += (m_speedModifier<0) ? (m_base_runSpeed*((float)m_speedModifier)/100.0f) : 0;
-		}
-		else
-		{
-			m_runSpeed = m_base_runSpeed*(1.0f + ((float)m_mountedspeedModifier)/100.0f);
-			m_runSpeed += (m_speedModifier<0) ? (m_base_runSpeed*((float)m_speedModifier)/100.0f) : 0;
-		}
+	case RUN:
+		m_runSpeed += mod;
+		break;
+	case SWIM:
+		m_swimSpeed += mod;
+		break;
+	case FLY: 
+		m_flySpeed += mod;
+		break;
+	case MOUNT:
+		m_mountSpeed += mod;
 	}
+}
 
-	
-
-	m_flySpeed = PLAYER_NORMAL_FLIGHT_SPEED*(1.0f + ((float)m_flyspeedModifier)/100.0f);
-
+void Unit::UpdateSpeed()
+{
 	// Limit speed due to effects such as http://www.wowhead.com/?spell=31896 [Judgement of Justice]
 	if( m_maxSpeed && m_runSpeed > m_maxSpeed )
 	{
Index: src/ascent-world/Unit.h
===================================================================
--- src/ascent-world/Unit.h	(revision 4541)
+++ src/ascent-world/Unit.h	(working copy)
@@ -1020,6 +1020,7 @@
 	bool GetSpeedDecrease();
 	int32 m_mountedspeedModifier;
 	int32 m_flyspeedModifier;
+	void UpdateSpeedFromAura(Aura * pAura, uint32 speedType, bool apply);
 	void UpdateSpeed();
 	void EnableFlight();
 	void DisableFlight();