From 089c984ee7270fbfebdb3a8448d75495f0adfe9c Mon Sep 17 00:00:00 2001
From: Rawng <rawng.github@gmail.com>
Date: Fri, 24 Jul 2015 09:52:05 -0400
Subject: Disable unstable move3 with new manaplus

---
 src/map/clif.cpp    | 47 ++++++++++++++++++++++++++++++++---------------
 src/mmo/version.hpp |  1 +
 2 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/src/map/clif.cpp b/src/map/clif.cpp
index 35cc463..49089d7 100644
--- a/src/map/clif.cpp
+++ b/src/map/clif.cpp
@@ -857,7 +857,7 @@ void clif_mob007b(dumb_ptr<mob_data> md, Buffer& buf)
  *------------------------------------------
  */
 static
-int clif_0225_being_move3(dumb_ptr<mob_data> md)
+int clif_0225_being_move3(dumb_ptr<mob_data> md, Buffer& buf)
 {
     Packet_Head<0x0225> head_225;
     std::vector<Packet_Repeat<0x0225>> repeat_225;
@@ -874,10 +874,7 @@ int clif_0225_being_move3(dumb_ptr<mob_data> md)
         repeat_225.push_back(move_225);
     }
 
-    Buffer buf = create_vpacket<0x0225, 14, 1>(head_225, repeat_225);
-
-    clif_send(buf, md, SendWho::AREA, 3);
-
+    buf = create_vpacket<0x0225, 14, 1>(head_225, repeat_225);
     return 0;
 }
 /*==========================================
@@ -2436,14 +2433,38 @@ void clif_getareachar_npc(dumb_ptr<map_session_data> sd, dumb_ptr<npc_data> nd)
  * 移動停止
  *------------------------------------------
  */
+
+static
+void clif_movemob_sub(dumb_ptr<block_list> sd_bl, dumb_ptr<mob_data> md)
+{
+    nullpo_retv(sd_bl);
+    nullpo_retv(md);
+    dumb_ptr<map_session_data> sd = sd_bl->is_player();
+    Buffer buf;
+
+    if (sd->client_version < 3 || sd->client_version >= 4)
+        clif_mob007b(md, buf); // backward compatibility for old clients
+    else
+    {
+        Buffer buf2;
+        clif_mob0078(md, buf2);
+        clif_send(buf2, sd, SendWho::SELF, MIN_CLIENT_VERSION);
+
+        clif_0225_being_move3(md, buf);
+    }
+
+    clif_send(buf, sd, SendWho::SELF, MIN_CLIENT_VERSION);
+}
+
 int clif_movemob(dumb_ptr<mob_data> md)
 {
     nullpo_retz(md);
 
-    Buffer buf;
-    clif_mob007b(md, buf);
-    clif_send(buf, md, SendWho::AREA, MIN_CLIENT_VERSION);
-    clif_0225_being_move3(md);
+    map_foreachinarea(std::bind(clif_movemob_sub, ph::_1, md),
+            md->bl_m,
+            md->bl_x - AREA_SIZE, md->bl_y - AREA_SIZE,
+            md->bl_x + AREA_SIZE, md->bl_y + AREA_SIZE,
+            BL::PC);
 
     return 0;
 }
@@ -2458,9 +2479,7 @@ int clif_fixmobpos(dumb_ptr<mob_data> md)
 
     if (md->state.state == MS::WALK)
     {
-        Buffer buf;
-        clif_mob007b(md, buf);
-        clif_send(buf, md, SendWho::AREA, MIN_CLIENT_VERSION);
+        clif_movemob(md);
     }
     else
     {
@@ -2540,9 +2559,7 @@ void clif_getareachar_mob(dumb_ptr<map_session_data> sd, dumb_ptr<mob_data> md)
 
     if (md->state.state == MS::WALK)
     {
-        Buffer buf;
-        clif_mob007b(md, buf);
-        send_buffer(sd->sess, buf);
+        clif_movemob_sub(sd, md);
     }
     else
     {
diff --git a/src/mmo/version.hpp b/src/mmo/version.hpp
index 20cb1d9..459b500 100644
--- a/src/mmo/version.hpp
+++ b/src/mmo/version.hpp
@@ -39,6 +39,7 @@ namespace tmwa
 // 1 = latest mana, old manaplus, bots
 // 2 = manaplus 1.5.5.9 and above
 // 3 = manaplus 1.5.5.23 and above
+// 4 = manaplus 1.5.8.15 and above
 #define MIN_CLIENT_VERSION 1
 
 // TODO now that I generate the protocol, split 'flags' out of the struct
-- 
cgit v1.2.3-70-g09d2