--- deliantra/server/lib/cf.pm 2006/03/24 18:20:41 1.10 +++ deliantra/server/lib/cf.pm 2006/03/28 16:48:11 1.12 @@ -78,12 +78,12 @@ } sub inject_global_event { - my ($data) = @_; + my $event = shift; - my $cb = $hook[$data->{event_code}] + my $cb = $hook[$event] or return; - List::Util::max map $_->($data), values %$cb + List::Util::max map &$_, values %$cb } sub inject_command { @@ -279,15 +279,26 @@ my $path = $event->{message}; my $ob = $event->{who}; - open my $fh, "<:raw", "$path.cfperl" - or return; # no perl data + if (open my $fh, "<:raw", "$path.cfperl") { - my $data = Storable::thaw do { local $/; <$fh> }; + #d##TODO#remove - $data->{version} <= 1 - or return; # too new + my $data = Storable::thaw do { local $/; <$fh> }; + + $data->{version} <= 1 + or return; # too new - %$ob = %{$data->{ob}}; + %$ob = %{$data->{ob}}; + return; + } + + for my $o ($ob, $ob->inv) { + if (my $value = $o->get_ob_key_value ("_perl_data")) { + $o->set_ob_key_value ("_perl_data"); + + %$o = %{ Storable::thaw pack "H*", $value }; + } + } }; *on_player_save = sub { @@ -295,23 +306,10 @@ my $path = $event->{message}; my $ob = $event->{who}; - if (keys %$ob) { - open my $fh, ">:raw", "$path.cfperl" - or die "$path.cfperl: $!"; + $_->set_ob_key_value (_perl_data => unpack "H*", Storable::nfreeze $_) + for grep %$_, $ob, $ob->inv; - stat $path; - - print $fh Storable::nfreeze { - size => (stat _)[7], - time => (stat _)[9], - version => 1, - ob => $ob, - }; - - chmod SAVE_MODE, "$path.cfperl"; # very racy, but cf-compatible *g* - } else { - unlink "$path.cfperl"; - } + unlink "$path.cfperl";#d##TODO#remove }; register "", __PACKAGE__;