void Curse(Player sender) {
     if (sender.ExtraData["cursorlocked"] != null && (bool)sender.ExtraData["cursorlocked"]) return;
     lock (this) {
         sender.ExtraData["cursorlocked"] = true;
         if (sender.ExtraData["Cursor"] != null) {
             Vector3S old;
             if (sender.ExtraData["Cursor"].GetType() == typeof(Vector3S))
                 old = (Vector3S)sender.ExtraData["Cursor"];
             else {
                 old = new Vector3S();
                 old.FromString((string)sender.ExtraData["Cursor"]);
             }
             sender.SendBlockChange((ushort)old.x, (ushort)old.z, (ushort)old.y, sender.Level.GetBlock(old));
         }
         Vector3S cursor = sender.GetBlockFromView();
         if ((object)cursor != null) {
             sender.SendBlockChange((ushort)cursor.x, (ushort)cursor.z, (ushort)cursor.y, 21);
         }
         sender.ExtraData["Cursor"] = cursor;
         sender.ExtraData["cursorlocked"] = false;
     }
 }