#!/usr/bin/perl
#use Mooix::Thing;
#use Fcntl q{:flock};
run sub {
	my $this=shift;
	my $amount=shift;

	# Only interested in increases in mass.
	return $amount if $amount <= 0;
	
	my $max=$this->maxweight;
	my $mass=$this->_mass + $amount;

	if ($mass > $max) {
		# Overloaded; begin dropping stuff.
		# Bigger objects tend to get away from the avatar first.
		# This is good as it results in accidentially dropping
		# fewer objects overall.
		my @contents=$this->contents->list;
		my %masses=map { $_->index => $_->mass } @contents;
		my @bymass = sort { $masses{$a->index} <=> $masses{$b->index} }
		             @contents;
		do {
			foreach my $obj (@bymass) {
				if (rand > 0.5) {
					my $lock=$obj->getlock(LOCK_EX|LOCK_NB);
					next unless $lock;
					$this->msg('overload_drop', object => $obj, avatar => $this);
					$obj->drop(to => $this->location);
					$mass -= $masses{$obj->index};
					@bymass = grep { $_ != $obj } @bymass;
					last;
				}
			}
		} while ($mass > $max && @bymass);
	}
	elsif ($mass >= $max * 0.9) {
		# Getting overloaded..
		$this->msg('overloaded', avatar => $this);
	}

	return $amount;
}
