public void touch(Entity self, Entity other, Plane plane, Surface surf) {
          if ((other.flags & (Constants.FL_FLY | Constants.FL_SWIM)) != 0) return;
          if ((other.svflags & Constants.SVF_DEADMONSTER) != 0) return;
          if (0 == (other.svflags & Constants.SVF_MONSTER)) return;

          // set XY even if not on ground, so the jump will clear lips
          other.velocity[0] = self.movedir[0] * self.speed;
          other.velocity[1] = self.movedir[1] * self.speed;

          if (other.groundentity != null) return;

          other.groundentity = null;
          other.velocity[2] = self.movedir[2];
        }