--- deliantra/server/lib/cf.pm 2006/12/11 01:30:41 1.83 +++ deliantra/server/lib/cf.pm 2006/12/11 22:56:57 1.85 @@ -18,9 +18,12 @@ use strict; +our %COMMAND = (); +our %COMMAND_TIME = (); +our %EXTCMD = (); + _init_vars; -our %COMMAND = (); our @EVENT; our $LIBDIR = maps_directory "perl"; @@ -30,10 +33,7 @@ our %CFG; -our $uptime;#d# -our $UPTIME; -$UPTIME ||= $uptime;#d# -$UPTIME ||= time; +our $UPTIME; $UPTIME ||= time; ############################################################################# @@ -90,8 +90,6 @@ my %ext_pkg; my @exts; my @hook; -my %command; -my %extcmd; =head2 UTILITY FUNCTIONS @@ -572,46 +570,32 @@ ; ############################################################################# -# old plug-in events +# command handling &c -sub inject_event { - my $extension = shift; - my $event_code = shift; +=item cf::register_command $name => \&callback($ob,$args); - my $cb = $hook[$event_code]{$extension} - or return; +Register a callback for execution when the client sends the user command +$name. - &$cb -} +=cut -sub inject_global_event { - my $event = shift; +sub register_command { + my ($name, $cb) = @_; - my $cb = $hook[$event] - or return; + my $caller = caller; + #warn "registering command '$name/$time' to '$caller'"; - List::Util::max map &$_, values %$cb + push @{ $COMMAND{$name} }, [$caller, $cb]; } -sub inject_command { - my ($name, $obj, $params) = @_; +=item cf::register_extcmd $name => \&callback($pl,$packet); - for my $cmd (@{ $command{$name} }) { - $cmd->[1]->($obj, $params); - } +Register a callbackf ro execution when the client sends an extcmd packet. - -1 -} - -sub register_command { - my ($name, $time, $cb) = @_; +If the callback returns something, it is sent back as if reply was being +called. - my $caller = caller; - #warn "registering command '$name/$time' to '$caller'"; - - push @{ $command{$name} }, [$time, $cb, $caller]; - $COMMAND{"$name\000"} = List::Util::max map $_->[0], @{ $command{$name} }; -} +=cut sub register_extcmd { my ($name, $cb) = @_; @@ -619,9 +603,41 @@ my $caller = caller; #warn "registering extcmd '$name' to '$caller'"; - $extcmd{$name} = [$cb, $caller]; + $EXTCMD{$name} = [$cb, $caller]; } +attach_to_players + on_command => sub { + my ($pl, $name, $params) = @_; + + my $cb = $COMMAND{$name} + or return; + + for my $cmd (@$cb) { + $cmd->[1]->($pl->ob, $params); + } + + cf::override; + }, + on_extcmd => sub { + my ($pl, $buf) = @_; + + my $msg = eval { from_json $buf }; + + if (ref $msg) { + if (my $cb = $EXTCMD{$msg->{msgtype}}) { + if (my %reply = $cb->[0]->($pl, $msg)) { + $pl->ext_reply ($msg->{msgid}, %reply); + } + } + } else { + warn "player " . ($pl->ob->name) . " sent unparseable ext message: <$buf>\n"; + } + + cf::override; + }, +; + sub register { my ($base, $pkg) = @_; @@ -673,21 +689,19 @@ # } # remove commands - for my $name (keys %command) { - my @cb = grep $_->[2] ne $pkg, @{ $command{$name} }; + for my $name (keys %COMMAND) { + my @cb = grep $_->[0] ne $pkg, @{ $COMMAND{$name} }; if (@cb) { - $command{$name} = \@cb; - $COMMAND{"$name\000"} = List::Util::max map $_->[0], @cb; + $COMMAND{$name} = \@cb; } else { - delete $command{$name}; - delete $COMMAND{"$name\000"}; + delete $COMMAND{$name}; } } # remove extcmds - for my $name (grep $extcmd{$_}[1] eq $pkg, keys %extcmd) { - delete $extcmd{$name}; + for my $name (grep $EXTCMD{$_}[1] eq $pkg, keys %EXTCMD) { + delete $EXTCMD{$name}; } if (my $cb = $pkg->can ("unload")) { @@ -713,30 +727,6 @@ } ############################################################################# -# extcmd framework, basically convert ext -# into pkg::->on_extcmd_arg1 (...) while shortcutting a few - -attach_to_players - on_extcmd => sub { - my ($pl, $buf) = @_; - - my $msg = eval { from_json $buf }; - - if (ref $msg) { - if (my $cb = $extcmd{$msg->{msgtype}}) { - if (my %reply = $cb->[0]->($pl, $msg)) { - $pl->ext_reply ($msg->{msgid}, %reply); - } - } - } else { - warn "player " . ($pl->ob->name) . " sent unparseable ext message: <$buf>\n"; - } - - cf::override; - }, -; - -############################################################################# # load/save/clean perl data associated with a map *cf::mapsupport::on_clean = sub { @@ -1160,7 +1150,9 @@ }; } -register_command "perl-reload", 0, sub { +register "", __PACKAGE__; + +register_command "perl-reload" => sub { my ($who, $arg) = @_; if ($who->flag (FLAG_WIZ)) { @@ -1171,8 +1163,6 @@ } }; -register "", __PACKAGE__; - unshift @INC, $LIBDIR; $TICK_WATCHER = Event->timer (