Index: /trunk/src/game/Object.h
===================================================================
--- /trunk/src/game/Object.h (revision 102)
+++ /trunk/src/game/Object.h (revision 118)
@@ -373,4 +373,13 @@
             GetNearPoint(obj,x,y,z,obj->GetObjectSize(),distance2d,GetAngle( obj ));
         }
+        void GetRandomContactPoint( const WorldObject* obj, float &x, float &y, float &z, float distance2dMin, float distance2dMax ) const
+        {
+            float object_size = obj->GetObjectSize();//here we use object_size to determine the angle offset, the bigger object the smaller angle offset, then this makes mob move naturally in visual.
+            //let assume 12.0f is the max size for object to have 0 angle offset.
+            float angle_offset_ratio = 1 - object_size/12.0f;
+            if (angle_offset_ratio < 0.05) angle_offset_ratio = 0.05;
+            // angle to face `obj` to `this`plus a random angle offset(from -90 degree to 90 degree)*angle_offset_ratio using distance from distance2dMin to distance2dMax includes size of `obj`
+            GetNearPoint(obj,x,y,z,object_size,distance2dMin+(distance2dMax-distance2dMin)*rand_norm(), GetAngle( obj ) + (M_PI_2 - M_PI * rand_norm()) * angle_offset_ratio);
+        }
 
         float GetObjectSize() const
Index: /trunk/src/game/TargetedMovementGenerator.cpp
===================================================================
--- /trunk/src/game/TargetedMovementGenerator.cpp (revision 102)
+++ /trunk/src/game/TargetedMovementGenerator.cpp (revision 118)
@@ -60,6 +60,6 @@
     if(!i_offset)
     {
-        // to nearest contact position
-        i_target->GetContactPoint( &owner, x, y, z );
+        // to nearest random contact position 
+        i_target->GetRandomContactPoint( &owner, x, y, z,0.5f,4.5f );
     }
     else
Index: /trunk/src/game/Map.cpp
===================================================================
--- /trunk/src/game/Map.cpp (revision 102)
+++ /trunk/src/game/Map.cpp (revision 118)
@@ -1420,4 +1420,11 @@
 bool InstanceMap::CanEnter(Player *player)
 {
+    if(!player->isGameMaster() && i_data && i_data->IsEncounterInProgress())
+    {
+        sLog.outDebug("InstanceMap::CanEnter - Player '%s' can't enter instance '%s' while an encounter is in progress.", player->GetName(), GetMapName());
+        player->SendTransferAborted(GetId(), TRANSFER_ABORT_ZONE_IN_COMBAT);
+        return false;
+    }
+
     if(std::find(i_Players.begin(),i_Players.end(),player)!=i_Players.end())
     {
Index: /trunk/src/bindings/scripts/include/sc_creature.cpp
===================================================================
--- /trunk/src/bindings/scripts/include/sc_creature.cpp (revision 113)
+++ /trunk/src/bindings/scripts/include/sc_creature.cpp (revision 118)
@@ -93,5 +93,5 @@
         {
             //If we are within range melee the target
-            if (m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
+            if (m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE))
             {
                 m_creature->AttackerStateUpdate(m_creature->getVictim());
@@ -149,5 +149,5 @@
     {
         //If we are within range melee the target
-        if (m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE))
+        if (m_creature->IsWithinCombatDist(m_creature->getVictim(), ATTACK_DISTANCE))
         {
             m_creature->AttackerStateUpdate(m_creature->getVictim());
