--- deliantra/server/ext/cfplus.ext 2007/06/16 14:35:41 1.5 +++ deliantra/server/ext/cfplus.ext 2007/11/14 08:10:12 1.11 @@ -21,13 +21,11 @@ =cut cf::register_extcmd cfplus_support => sub { - my ($pl, $msg) = @_; + my ($pl, %msg) = @_; - # $msg->{version} + $pl->ns->{cfplus_ext} = $msg{version}; - ( - version => 2, - ) + (version => $msg{version} >= 2 ? 2 : 0) }; sub dialog_tell { @@ -35,9 +33,11 @@ my $pl = $dialog->{pl}; my ($reply, @kw) = $dialog->tell ($msg); - $reply = "..." unless $reply; - $pl->ext_reply ($id => msgtype => "reply", msg => $reply, add_topics => \@kw); + $reply = "..." unless defined $reply; + + $pl->ext_msg ($id, update => msg => $pl->expand_cfpod ($reply), add_topics => \@kw) + if $reply ne ""; # NPC might not want to say, or wants to say something later } =item ... = extcmd lookat { dx => $dx, dy => $dy } @@ -53,8 +53,7 @@ =cut cf::register_extcmd lookat => sub { - my ($pl, $msg) = @_; - my ($dx, $dy) = @$msg{qw(dx dy)}; + my ($pl, $dx, $dy) = @_; return unless $pl->ob && $pl->ob->map; @@ -64,7 +63,7 @@ if ($pl->cell_visible ($dx, $dy)) { for my $ob ($pl->ob->map->at ($pl->ob->x + $dx, $pl->ob->y + $dy)) { - $res{npc_dialog} = $ob->name + $res{npc_dialog} = [$ob->name, $dx, $dy] if $near && NPC_Dialogue::has_dialogue $ob && !$pl->{npc_dialog}; } } @@ -85,24 +84,29 @@ =cut cf::register_extcmd npc_dialog_begin => sub { - my ($pl, $msg) = @_; - my ($id, $dx, $dy) = @$msg{qw(msgid dx dy)}; + my ($pl, $id, $token) = @_; + + #TODO: + # this is not a request, so returnign does no good: make it a request and die on error return unless $pl->ob && $pl->ob->map; - return unless (abs $dx) <= 2 && (abs $dy) <= 2; - return unless $pl->cell_visible ($dx, $dy); - return if $pl->{npc_dialog}; # only one dialog at a time + + my ($name, $dx, $dy) = @$token; + + return (error => "too far away") unless (abs $dx) <= 2 && (abs $dy) <= 2; + return (error => "nothing to talk there") unless $pl->cell_visible ($dx, $dy); + return (error => "only one dialog can be open at a time") if $pl->{npc_dialog}; # only one dialog at a time for my $npc ($pl->ob->map->at ($pl->ob->x + $dx, $pl->ob->y + $dy)) { if (NPC_Dialogue::has_dialogue $npc) { $pl->attach ("npc_dialog_active"); - $pl->{npc_dialog} = new NPC_Dialogue pl => $pl, npc => $npc; + $pl->{npc_dialog} = new NPC_Dialogue pl => $pl, npc => $npc, id => $id; dialog_tell $id, $pl->{npc_dialog}, "hi"; return; } } - (msgtype => "error", msg => "nothing to talk to found") + (error => "nothing to talk to to found") }; =item ... = extcmd npc_dialog_tell { msgid => $id, msg => $text } @@ -110,7 +114,6 @@ Tells the NPC the given $text message and returns a reply structure which can have the following keys: - msgtype => "reply" msg => $reply_text, add_topics => [additional topic strings] del_topics => [invalidated topic strings] @@ -118,13 +121,11 @@ =cut cf::register_extcmd npc_dialog_tell => sub { - my ($pl, $msg) = @_; + my ($pl, $id, $msg) = @_; if (my $dialog = $pl->{npc_dialog}) { - dialog_tell $msg->{msgid}, $dialog, $msg->{msg}; + dialog_tell $id, $dialog, $msg; } - - () }; =item extcmd npc_dialog_end { msgid => $id } @@ -134,13 +135,11 @@ =cut cf::register_extcmd npc_dialog_end => sub { - my ($pl, $msg) = @_; + my ($pl, $id) = @_; if (my $dialog = delete $pl->{npc_dialog}) { - $pl->detach ("ncpa_dialog_active"); + $pl->detach ("ncp_dialog_active"); } - - () }; =item ... = extcmd editor_support @@ -172,7 +171,7 @@ =cut cf::register_extcmd editor_support => sub { - my ($pl, $msg) = @_; + my ($pl, %msg) = @_; map +($_ => $cf::CFG{"editor_$_"}), qw(servertype gameserver testserver cvs_root lib_root builder_ui) }; @@ -181,7 +180,7 @@ for my $pl (cf::player::list) { if (my $dialog = delete $pl->{npc_dialog}) { $pl->detach ("npc_dialog_active"); - $pl->ext_reply ($dialog->{id} => msgtype => "error", msg => "npc dialogue module was reloaded"); + $pl->ext_msg ($dialog->{id} => error => "npc dialogue module was reloaded"); } } } @@ -196,22 +195,21 @@ on_move => sub { my ($pl, $dir) = @_; - if (my $dialog = $pl->{npc_dialog}) { - warn "on_move<@_>\n";#d# - warn $pl->ob; - warn $dialog; - warn $dialog->{npc}; - warn $dialog->{npc}->is_valid; - - my (undef, $dx, $dy) = $pl->ob->rangevector ($dialog->{npc}); - - return if (abs $dx) <= 2 && (abs $dy) <= 2; + # must delay a bit :/ + my $delay; $delay = EV::timer 0, 0, sub { + undef $delay; + + if (my $dialog = $pl->{npc_dialog}) { + my (undef, $dx, $dy) = $pl->ob->rangevector ($dialog->{npc}); + + return if (abs $dx) <= 2 && (abs $dy) <= 2; - $pl->ext_reply ($dialog->{id} => msgtype => "error", msg => "out of range"); - } + $pl->ext_msg ($dialog->{id} => error => "out of range"); + } - delete $pl->{npc_dialog}; - $pl->detach ("npc_dialog_active"); + delete $pl->{npc_dialog}; + $pl->detach ("npc_dialog_active"); + }; }, ;