--- deliantra/server/ext/reseller.ext 2006/12/15 19:29:18 1.1 +++ deliantra/server/ext/reseller.ext 2007/06/06 17:41:17 1.6 @@ -1,4 +1,4 @@ -#!perl +#!perl # MANDATORY my %unit = ( silver => 1, @@ -12,34 +12,49 @@ royalties => 'royalty', ); +sub ob2info { + my ($item, $rval) = @_; + sprintf "[%s from %s (%d:%d%s) nrof: %d uuid: %s]", + $item->name, $item->get_ob_key_value ('ext_reseller_seller'), + $item->get_ob_key_value ('ext_reseller_orig_value'), $item->value, + (defined $rval ? ":$rval" : ""), $item->nrof, $item->uuid; +} + +sub audit_log { + my ($who, $action, $info) = @_; + warn + sprintf "RESELLER_AUDIT(%s) %s %s: %s\n", + $who->map->path, $who->name, $action, $info; +} + +sub find_rec; + sub find_rec { my ($ob, $cb) = @_; - my @unpaid; + my @found; for my $i ($ob->inv) { - push @unpaid, $i if $cb->($i); - - push @unpaid, find_unpaid ($i, $cb) - if $i->inv; + push @found, $i if $cb->($i); + push @found, find_rec $i, $cb if $i->inv; } - return @unpaid; + + return @found; } sub find_unpaid { my ($ob) = @_; - my @r = find_rec ($ob, sub { $_[0]->flag (cf::FLAG_UNPAID) }); - return @r; + find_rec $ob, sub { $_[0]->flag (cf::FLAG_UNPAID) }; } sub find_traded { my ($ob) = @_; - my @r = find_rec ($ob, sub { $_[0]->get_ob_key_value ('ext_reseller_seller') ne '' }); - return @r; + find_rec $ob, sub { $_[0]->get_ob_key_value ('ext_reseller_seller') ne '' }; } cf::register_script_function "reseller::list_sells" => sub { my ($who, $msg, $npc) = @_; - my $sells = cf::from_json $npc->get_ob_key_value ('ext_reseller_sales'); + my $ext_re_sales = $npc->get_ob_key_value ('ext_reseller_sales'); + my $sells = $ext_re_sales && cf::from_json $ext_re_sales; my $hissells = $sells->{$who->name}; unless (keys %{$hissells || {}}) { @@ -59,7 +74,8 @@ cf::register_script_function "reseller::pay_player" => sub { my ($who, $msg, $npc) = @_; - my $sells = cf::from_json $npc->get_ob_key_value ('ext_reseller_sales'); + my $ext_re_sales = $npc->get_ob_key_value ('ext_reseller_sales'); + my $sells = $ext_re_sales && cf::from_json $ext_re_sales; my $hissells = $sells->{$who->name}; unless (keys %{$hissells || {}}) { @@ -73,14 +89,17 @@ $who->pay_player ($sum); $who->reply ($npc, "Here are the " . cf::cost_string_from_value ($sum) . " for your sales"); + audit_log ($who, 'collects', "$sum silver"); + $sells->{$who->name} = {}; - $npc->set_ob_key_value (ext_reseller_sales => cf::to_json $sells); + $npc->set_ob_key_value (ext_reseller_sales => cf::to_json $sells) + if $sells; 0 }; -cf::register_attachment "reseller_shopmat", +cf::object::attachment "reseller_shopmat", on_move_trigger => sub { my ($self, $who_caused, $who) = @_; @@ -88,16 +107,18 @@ $who->map->at ($self->{reseller_shopmat}{npc_x}, $self->{reseller_shopmat}{npc_y}); unless (@obs) { - warn "Couldn't find shop keeper in " . $who->map . "\n"; + warn "Couldn't find shop keeper in " . $who->map->path . "\n"; return cf::override; } - my $sells = cf::from_json $obs[0]->get_ob_key_value ('ext_reseller_sales'); + my $ext_re_sales = $obs[0]->get_ob_key_value ('ext_reseller_sales'); + my $sells = $ext_re_sales && cf::from_json $ext_re_sales; my $unpaid_items = {}; for my $item (find_unpaid ($who)) { if ($item->get_ob_key_value ('ext_reseller_seller') eq $who->name) { + audit_log ($who, 'removes', ob2info ($item)); $item->flag (cf::FLAG_UNPAID, 0); $item->remove; $item->insert_ob_in_ob ($who); @@ -113,25 +134,37 @@ $unpaid_items->{$item} = [$value, $item]; } + audit_log ($who, 'wants', (join ",", map { ob2info ($_->[1], $_->[0]) } values %$unpaid_items)) + if %$unpaid_items; + $self->apply_shop_mat ($who); + my @seller_noted; + for my $item (find_traded ($who)) { next if $item->flag (cf::FLAG_UNPAID); if (my $value = $unpaid_items->{$item}[0]) { + push @seller_noted, ob2info ($item, $value)."P"; $sells->{$item->get_ob_key_value ('ext_reseller_seller')}->{$item->name} += $value; + } else { + push @seller_noted, ob2info ($item)."T"; } $item->value ($item->get_ob_key_value ('ext_reseller_orig_value')); $item->set_ob_key_value (ext_reseller_seller => ''); } - $obs[0]->set_ob_key_value (ext_reseller_sales => cf::to_json $sells); + audit_log ($who, 'removed', (join ",", @seller_noted)) + if @seller_noted; + + $obs[0]->set_ob_key_value (ext_reseller_sales => cf::to_json $sells) + if $sells; cf::override; }, ; -cf::register_attachment "reseller_floor", +cf::object::attachment "reseller_floor", on_drop_on => sub { my ($on, $what, $who) = @_; my $name = $what->custom_name; @@ -223,6 +256,8 @@ $what->flag (cf::FLAG_UNPAID, 1); $what->insert_ob_in_map_at ($who->map, $who, cf::INS_BELOW_ORIGINATOR, $who->x, $who->y); + audit_log ($who, 'sells', ob2info ($what)); + cf::override; }, ;