--- deliantra/server/ext/Jeweler.pm 2008/07/13 20:15:51 1.26 +++ deliantra/server/ext/Jeweler.pm 2008/07/20 17:01:29 1.27 @@ -588,10 +588,14 @@ if ($do_remove) { my $rem = $costs->{$key}; - $self->do_grep (sub { if ($rem) { $rem = Jeweler::Util::remove ($_[0], $rem); } 1 }, @grepar); + $self->do_grep (sub { + if ($rem) { $rem = Jeweler::Util::remove ($_[0], $rem); } + 1 + }, @grepar); if ($rem > 0) { - warn "JEWELER BUG: removed ingredients $rem > 0 after removing!"; + warn "JEWELER BUG: removed ingredients ($key) $rem > 0 after removing!"; } + } else { my $nr; $self->do_grep (sub { $nr += ($_[0]->nrof || 1); 0 }, @grepar); @@ -1102,29 +1106,18 @@ =item remove ($object[, $nrof]) Removes the C<$object>. If C<$nrof> is given, remove only C<$nrof> objects. -The returnvalue is the number of 'single' objects that couldn't be removed. +The return value is the number of 'single' objects that couldn't be removed. =cut sub remove { my ($obj, $nrof) = @_; + + my $c = $obj->nrof || 1; + my $r = $c > $nrof ? 0 : $nrof - $c; + $obj->decrease (defined ($nrof) ? $nrof : ($obj->nrof || 1)); - my $cnt; - - if (defined $nrof) { - # TODO: Check tihis line: - return 0 if ($nrof * 1) == 0; #XXX: ??? - $cnt = int (($obj->nrof || 1) - (1 * $nrof)); - - if ($cnt > 0) { - $obj->nrof ($cnt); - return 0; - } - } - - remove ($_) for $obj->inv; - $obj->destroy; - return $cnt; + $r } sub check_for_match {