--- deliantra/server/lib/cf.pm 2006/03/07 01:37:06 1.6 +++ deliantra/server/lib/cf.pm 2006/03/16 21:08:16 1.8 @@ -214,6 +214,18 @@ } }; +############################################################################# +# load/save/clean perl data associated with a map + +*on_mapclean = sub { + my $map = shift->{map}; + + my $path = $map->tmpname; + defined $path or return; + + unlink "$path.cfperl"; +}; + *on_mapin = *on_mapload = sub { my $map = shift->{map}; @@ -244,10 +256,59 @@ open my $fh, ">:raw", "$path.cfperl" or die "$path.cfperl: $!"; + stat $path; + print $fh Storable::nfreeze { + size => (stat _)[7], + time => (stat _)[9], version => 1, - obs => $obs, + obs => $obs, }; + + chmod SAVE_MODE, "$path.cfperl"; # very racy, but cf-compatible *g* + } else { + unlink "$path.cfperl"; + } +}; + +############################################################################# +# load/save perl data associated with player->ob objects + +*on_player_load = sub { + my ($event) = @_; + my $path = $event->{message}; + my $ob = $event->{who}; + + open my $fh, "<:raw", "$path.cfperl" + or return; # no perl data + + my $data = Storable::thaw do { local $/; <$fh> }; + + $data->{version} <= 1 + or return; # too new + + %$ob = %{$data->{ob}}; +}; + +*on_player_save = sub { + my ($event) = @_; + my $path = $event->{message}; + my $ob = $event->{who}; + + if (keys %$ob) { + open my $fh, ">:raw", "$path.cfperl" + or die "$path.cfperl: $!"; + + 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"; }