Client v7 extensions
From Iris2
thanks to cougar for those infos
new anim packet animation 0xe2
using System;
namespace Server
{
#region AnimationType
public enum AnimationType//table from debugged client.exe ;)
{
None = -1,
Attack = 0,
Parry = 1,
Block = 2,
Die = 3,
Impact = 4,
Fidget = 5,
Eat = 6,
Emote = 7,
Alert = 8,
TakeOff = 9,
Land = 10,
Spell = 11,
StartCombat = 12,
EndCombat = 13,
Pillage = 14,
Spawn = 15// 3D Only
}
#endregion
#region SubTypes
public enum AttackSubType
{
AttackBareHand = 0,
AttackBow = 1,
AttackCrossbow = 2,
AttackSmashOverHead = 3,
AttackSmash = 4,
AttackStab = 5,
AttackCrush = 6,
AttackSwing = 7,
AttackBackStab = 8,
}
public enum EmoteSubType
{
Bow = 0,
Salute = 1,
Walk = 2,
}
public enum FidgetSubType
{
Idle = 0,
}
public enum EatSubType
{
Eat = 0,
}
public enum ImpactSubType
{
GetHit = 0,
}
public enum SpellSubType
{
Cast = 0,
WaveHands = 1,
}
public enum DieSubType
{
Die = 0,
}
public enum BlockSubType
{
Block = 0,
}
#endregion
public class AnimationInfo
{
//private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType );
private AnimationType m_Action;
private int m_SubAction;
private int m_ActionType;
public AnimationInfo( AnimationType action, int subAction, int actionType )
{
m_Action = action;
m_SubAction = subAction;
m_ActionType = actionType;
}
public AnimationType Action
{
get { return m_Action; }
set { m_Action = value; }
}
public int SubAction
{
get { return m_SubAction; }
set { m_SubAction = value; }
}
public int ActionType
{
get { return m_ActionType; }
set { m_ActionType = value; }
}
public static AnimationInfo GetNewAction( Body body, int oldAction )
{
if( body.IsHuman || body.IsEquipment )
{
switch( oldAction )
{
case 05: return new AnimationInfo( AnimationType.Fidget, (int)FidgetSubType.Idle, 0 );//Idle look around
case 06: return new AnimationInfo( AnimationType.Fidget, (int)FidgetSubType.Idle, 1 );//Idle fidle
case 31: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackBareHand, 0 );//Attack bare hand
case 18:
case 27: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackBow, 0 );//Attack bow
case 19:
case 28: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackCrossbow, 0 );//Attack crossbow
case 26:
case 11: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackSmashOverHead, 0 );//Attack
case 29: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackBareHand, 2 );//Horse Attack 2H
case 09: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackSmash, 0 );//Attack
case 10: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackStab, 0 );//Attack
case 12: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackCrush, 0 );//Attack
case 13: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackSwing, 0 );//Attack
case 14: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackBackStab, 0 );//Attack
case 16: return new AnimationInfo( AnimationType.Spell, (int)SpellSubType.Cast, 0 );//Cast
case 17: return new AnimationInfo( AnimationType.Spell, (int)SpellSubType.WaveHands, 0 );//Cast hands up
case 20: return new AnimationInfo( AnimationType.Impact, (int)ImpactSubType.GetHit, 0 );//Get Hit
case 21: return new AnimationInfo( AnimationType.Die, (int)DieSubType.Die, 1 );//Die (backwards)
case 22: return new AnimationInfo( AnimationType.Die, (int)DieSubType.Die, 0 );//Die (forwards)
case 30: return new AnimationInfo( AnimationType.Block, (int)BlockSubType.Block, 0 );// OR (1, 0, 0) Block
case 32: return new AnimationInfo( AnimationType.Emote, (int)EmoteSubType.Bow, 0 );//Bow
case 33: return new AnimationInfo( AnimationType.Emote, (int)EmoteSubType.Salute, 0 );//Salute
case 34: return new AnimationInfo( AnimationType.Eat, (int)EatSubType.Eat, 0 );//Eat/Drink
case 38: return new AnimationInfo( AnimationType.Emote, (int)EmoteSubType.Walk, 0 );//walk 2D only
default:
Console.WriteLine( "Unhandled Human Animation {0}", oldAction ); break;
}
}
else if( body.IsMonster )
{
switch( oldAction )
{
case 02: return new AnimationInfo( AnimationType.Die, (int)DieSubType.Die, 1 );//Die 1
case 03: return new AnimationInfo( AnimationType.Die, (int)DieSubType.Die, 0 );//Die 2
case 04: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackBareHand, 0 );//Attack 1
case 05: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackBareHand, 1 );//Attack 2
case 06: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackBareHand, 2 );//Attack 3
case 11: return new AnimationInfo( AnimationType.Pillage, (int)EatSubType.Eat, 0 );//Eat
case 12: return new AnimationInfo( AnimationType.Spell, (int)SpellSubType.Cast, 0 );//Special Attack / Fire Breath
case 15: return new AnimationInfo( AnimationType.Block, (int)BlockSubType.Block, 1 );//Block 1
case 16: return new AnimationInfo( AnimationType.Block, (int)BlockSubType.Block, 0 );//Block 2
case 17: return new AnimationInfo( AnimationType.Fidget, (int)FidgetSubType.Idle, 0 );//Idle 1
case 18: return new AnimationInfo( AnimationType.Fidget, (int)FidgetSubType.Idle, 1 );//Idle 2
case 20: return new AnimationInfo( AnimationType.TakeOff, 0, 0 );//Fly
case 21:
case 10: return new AnimationInfo( AnimationType.Impact, (int)ImpactSubType.GetHit, 0 );//Get Hit
default:
Console.WriteLine( "Unhandled Monster Animation {0}", oldAction ); break;
}
}
else if( body.IsAnimal || body.IsSea )
{
switch( oldAction )
{
case 04: return new AnimationInfo( AnimationType.Alert, (int)AttackSubType.AttackBareHand, 0 );//Attack 3
case 03: return new AnimationInfo( AnimationType.Alert, (int)EatSubType.Eat, 0 );//Eat
case 05: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackBareHand, 0 );//Attack 3
case 06: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackBareHand, 1 );//Attack 3
case 12: return new AnimationInfo( AnimationType.Attack, (int)AttackSubType.AttackBareHand, 2 );//Attack 3
case 07: return new AnimationInfo( AnimationType.Impact, (int)ImpactSubType.GetHit, 0 );//Get Hit
case 08: return new AnimationInfo( AnimationType.Die, (int)DieSubType.Die, 1 );//Die
case 09: return new AnimationInfo( AnimationType.Fidget, (int)FidgetSubType.Idle, 0 );//Idle 1
case 10: return new AnimationInfo( AnimationType.Fidget, (int)FidgetSubType.Idle, 1 );//Idle 2
case 15: return new AnimationInfo( AnimationType.Pillage, 0, 0 );//
default:
Console.WriteLine( "Unhandled Animal Animation {0}", oldAction ); break;
}
}
return new AnimationInfo( AnimationType.None, 0, 0 );
}
}
}
spellids mysticism+bardic
Register(677, typeof(Mysticism.NetherBoltSpell));
Register(678, typeof(Mysticism.HealingStoneSpell));
Register(679, typeof(Mysticism.PurgeMagicSpell));
Register(680, typeof(Mysticism.EnchantSpell));
Register(681, typeof(Mysticism.SleepSpell));
Register(682, typeof(Mysticism.EagleStrikeSpell));
Register(683, typeof(Mysticism.AnimatedWeaponSpell));
Register(684, typeof(Mysticism.StoneFormSpell));
Register(685, typeof(Mysticism.SpellTriggerSpell));
Register(686, typeof(Mysticism.MassSleepSpell));
Register(687, typeof(Mysticism.CleansingWindsSpell));
Register(688, typeof(Mysticism.BombardSpell));
Register(689, typeof(Mysticism.SpellPlagueSpell));
Register(690, typeof(Mysticism.HailStormSpell));
Register(691, typeof(Mysticism.NetherCycloneSpell));
Register(692, typeof(Mysticism.RisingColossusSpell));
Register(700, typeof(Bardic.Inspire));
Register(701, typeof(Bardic.Invigorate));
Register(702, typeof(Bardic.Resilience));
Register(703, typeof(Bardic.Perseverance));
Register(704, typeof(Bardic.Tribulation));
Register(705, typeof(Bardic.Despair));
