Index: ClientHandle.cpp
===================================================================
--- ClientHandle.cpp	(revision 1776)
+++ ClientHandle.cpp	(working copy)
@@ -997,6 +997,10 @@
 
 void cClientHandle::HandleAnimation(char a_Animation)
 {
+	if(cPluginManager::Get()->CallHookPlayerSwingLeftArm(*m_Player))
+	{
+		return;
+	}
 	m_Player->GetWorld()->BroadcastPlayerAnimation(*m_Player, a_Animation, this);
 }
 
Index: Plugin.h
===================================================================
--- Plugin.h	(revision 1776)
+++ Plugin.h	(working copy)
@@ -73,6 +73,7 @@
 	virtual bool OnPlayerRightClickingEntity(cPlayer & a_Player, cEntity & a_Entity) = 0;
 	virtual bool OnPlayerShooting           (cPlayer & a_Player) = 0;
 	virtual bool OnPlayerSpawned            (cPlayer & a_Player) = 0;
+	virtual bool OnPlayerSwingLeftArm       (cPlayer & a_Player) = 0;
 	virtual bool OnPlayerTossingItem        (cPlayer & a_Player) = 0;
 	virtual bool OnPlayerUsedBlock          (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) = 0;
 	virtual bool OnPlayerUsedItem           (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) = 0;
Index: Plugin_NewLua.cpp
===================================================================
--- Plugin_NewLua.cpp	(revision 1776)
+++ Plugin_NewLua.cpp	(working copy)
@@ -430,6 +430,18 @@
 
 
 
+bool cPlugin_NewLua::OnPlayerSwingLeftArm(cPlayer & a_Player)
+{
+	cCSLock Lock(m_CriticalSection);
+	bool res = false;
+	m_LuaState.Call(GetHookFnName(cPluginManager::HOOK_PLAYER_SWING_LEFT_ARM), &a_Player, cLuaState::Return, res);
+	return res;
+}
+
+
+
+
+
 bool cPlugin_NewLua::OnPlayerTossingItem(cPlayer & a_Player)
 {
 	cCSLock Lock(m_CriticalSection);
@@ -790,6 +802,7 @@
 		case cPluginManager::HOOK_PLAYER_RIGHT_CLICKING_ENTITY: return "OnPlayerRightClickingEntity";
 		case cPluginManager::HOOK_PLAYER_SHOOTING:              return "OnPlayerShooting";
 		case cPluginManager::HOOK_PLAYER_SPAWNED:               return "OnPlayerSpawned";
+		case cPluginManager::HOOK_PLAYER_SWING_LEFT_ARM:        return "OnPlayerSwingArm";
 		case cPluginManager::HOOK_PLAYER_TOSSING_ITEM:          return "OnPlayerTossingItem";
 		case cPluginManager::HOOK_PLAYER_USED_BLOCK:            return "OnPlayerUsedBlock";
 		case cPluginManager::HOOK_PLAYER_USED_ITEM:             return "OnPlayerUsedItem";
Index: Plugin_NewLua.h
===================================================================
--- Plugin_NewLua.h	(revision 1776)
+++ Plugin_NewLua.h	(working copy)
@@ -61,6 +61,7 @@
 	virtual bool OnPlayerRightClickingEntity(cPlayer & a_Player, cEntity & a_Entity) override;
 	virtual bool OnPlayerShooting           (cPlayer & a_Player) override;
 	virtual bool OnPlayerSpawned            (cPlayer & a_Player) override;
+	virtual bool OnPlayerSwingLeftArm       (cPlayer & a_Player) override;
 	virtual bool OnPlayerTossingItem        (cPlayer & a_Player) override;
 	virtual bool OnPlayerUsedBlock          (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta) override;
 	virtual bool OnPlayerUsedItem           (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) override;
Index: PluginManager.cpp
===================================================================
--- PluginManager.cpp	(revision 1776)
+++ PluginManager.cpp	(working copy)
@@ -741,6 +741,27 @@
 
 
 
+bool cPluginManager::CallHookPlayerSwingLeftArm(cPlayer & a_Player)
+{
+	HookMap::iterator Plugins = m_Hooks.find(HOOK_PLAYER_SWING_LEFT_ARM);
+	if (Plugins == m_Hooks.end())
+	{
+		return false;
+	}
+	for (PluginList::iterator itr = Plugins->second.begin(); itr != Plugins->second.end(); ++itr)
+	{
+		if ((*itr)->OnPlayerSwingLeftArm(a_Player))
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+
+
+
+
 bool cPluginManager::CallHookPlayerTossingItem(cPlayer & a_Player)
 {
 	HookMap::iterator Plugins = m_Hooks.find(HOOK_PLAYER_TOSSING_ITEM);
Index: PluginManager.h
===================================================================
--- PluginManager.h	(revision 1776)
+++ PluginManager.h	(working copy)
@@ -78,6 +78,7 @@
 		HOOK_PLAYER_RIGHT_CLICKING_ENTITY,
 		HOOK_PLAYER_SHOOTING,
 		HOOK_PLAYER_SPAWNED,
+		HOOK_PLAYER_SWING_LEFT_ARM,
 		HOOK_PLAYER_TOSSING_ITEM,
 		HOOK_PLAYER_USED_BLOCK,
 		HOOK_PLAYER_USED_ITEM,
@@ -152,6 +153,7 @@
 	bool CallHookPlayerRightClickingEntity(cPlayer & a_Player, cEntity & a_Entity);
 	bool CallHookPlayerShooting           (cPlayer & a_Player);
 	bool CallHookPlayerSpawned            (cPlayer & a_Player);
+	bool CallHookPlayerSwingLeftArm       (cPlayer & a_Player);
 	bool CallHookPlayerTossingItem        (cPlayer & a_Player);
 	bool CallHookPlayerUsedBlock          (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
 	bool CallHookPlayerUsedItem           (cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, char a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ);
