ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/commands.ext
(Generate patch)

Comparing deliantra/server/ext/commands.ext (file contents):
Revision 1.22 by pippijn, Fri Mar 2 10:44:56 2007 UTC vs.
Revision 1.43 by root, Mon May 7 03:05:58 2007 UTC

1#! perl 1#! perl # MANDATORY
2 2
3use POSIX (); 3use POSIX ();
4 4
5# miscellaneous commands 5# miscellaneous commands
6 6
17 17
18 if (length $from) { 18 if (length $from) {
19 $item = $ob->find_best_object_match ($from) 19 $item = $ob->find_best_object_match ($from)
20 or return $ob->message ("rename: could not find a matching item to rename."); 20 or return $ob->message ("rename: could not find a matching item to rename.");
21 } else { 21 } else {
22 $item = $ob->find_marked_object () 22 $item = $ob->find_marked_object
23 or return $ob->message ("rename: no from name and no marked item found to rename."); 23 or return $ob->message ("rename: no from name and no marked item found to rename.");
24 } 24 }
25 25
26 $item->custom_name (length $to ? $to : undef); 26 $item->custom_name (length $to ? $to : undef);
27 27
38 1 38 1
39} 39}
40 40
41sub ext::schmorp_irc::users; # HACK: TODO: replace by signal 41sub ext::schmorp_irc::users; # HACK: TODO: replace by signal
42 42
43sub who_listing(;$) { 43sub who_listing(;$$) {
44 my ($privileged) = @_; 44 my ($privileged, $select) = @_;
45 45
46 my ($numwiz, $numafk) = (0, 0); 46 my ($numwiz, $numafk) = (0, 0);
47 my @pl; 47 my @pl;
48 48
49 foreach my $pl (cf::player::list) { 49 foreach my $pl (cf::player::list) {
59 push @pl, $pl; 59 push @pl, $pl;
60 } 60 }
61 61
62 ( 62 (
63 "Total Players in The World. (" . (scalar @pl) . ") -- WIZ($numwiz) AFK($numafk) BOT(0)", 63 "Total Players in The World. (" . (scalar @pl) . ") -- WIZ($numwiz) AFK($numafk) BOT(0)",
64 ( 64 (grep /$select/,
65 map { 65 map {
66 my ($pl, $ob, $ns) = ($_, $_->ob, $_->ns); 66 my ($pl, $ob, $ns) = ($_, $_->ob, $_->ns);
67 67
68 "* " . $ob->name . "/" . $ob->level . " " . (length $pl->own_title ? $pl->own_title : "the " . $pl->title) 68 "* " . $ob->name . "/" . $ob->level . " " . (length $pl->own_title ? $pl->own_title : "the " . $pl->title)
69 . ($pl->peaceful ? " [peaceful]" : " [HOSTILE]") 69 . ($pl->peaceful ? " [peaceful]" : " [HOSTILE]")
70 . ($ns->afk ? " [AFK]" : "") 70 . ($ns->afk ? " [AFK]" : "")
71 . ($ob->flag (cf::FLAG_WIZ) ? " [WIZ]" : "") 71 . ($ob->flag (cf::FLAG_WIZ) ? " [WIZ]" : "")
72 . " [" . $pl->ns->version . "]" 72 . " [" . $pl->ns->version . "]"
73 . " [" . ($pl->peaceful || $privileged ? $ob->map->visible_name : $ob->region->name) . "]" 73 . " [" . ($pl->peaceful || $privileged ? $ob->map->visible_name : $ob->region->name) . "]"
74 . (sprintf " [rtt %.3fs]", $pl->ns->rtt * 1e-6) 74 . (sprintf " [rtt %.3fs]", $pl->ns->rtt * 1e-6)
75 . ($privileged ? " " . $pl->ns->host : "") 75 . ($privileged ? " " . $pl->ns->host : "")
76 } sort { (lc $a->ob->name) cmp (lc $b->ob->name) } @pl 76 } sort { (lc $a->ob->name) cmp (lc $b->ob->name) } @pl
77 ), 77 ),
78 eval { "* IRC: " . join ", ", ext::schmorp_irc::users }, 78 eval { "* IRC: " . join ", ", ext::schmorp_irc::users },
79 ) 79 )
80} 80}
81 81
82cf::register_command who => sub { 82cf::register_command who => sub {
83 my ($ob, $arg) = @_; 83 my ($ob, $arg) = @_;
84 84
85 $ob->speed_left ($ob->speed_left - 0.25); 85 $ob->speed_left ($ob->speed_left - 4);
86 86
87 $ob->reply (undef, (join "\n", who_listing $ob->may ("extended_who")), cf::NDI_UNIQUE | cf::NDI_DK_ORANGE); 87 $ob->reply (undef, (join "\n", who_listing $ob->may ("extended_who"), $arg), cf::NDI_UNIQUE | cf::NDI_DK_ORANGE);
88
89 1
90};
91
92cf::register_command seen => sub {
93 my ($pl, $args) = @_;
94
95 if (my ($login) = $args =~ /(\S+)/) {
96 if ($login eq $pl->name) {
97 $pl->message ("Very funny, $login. Ha. Ha.", cf::NDI_UNIQUE);
98 } elsif (cf::player::find_active $login) {
99 $pl->message ("$login is right here on this server!", cf::NDI_UNIQUE);
100 } elsif (cf::player::exists $login
101 and stat cf::player::path $login) {
102 my $time = (stat _)[9];
103
104 $pl->message ("$login was last seen here "
105 . (POSIX::strftime "%Y-%m-%d %H:%M:%S +0000", gmtime $time)
106 . " which was " . (int +(time - $time) / 3600) . " hours ago.", cf::NDI_UNIQUE);
107 } else {
108 $pl->message ("No player named $login is known to me.", cf::NDI_UNIQUE);
109 }
110 } else {
111 $pl->message ("Usage: seen <player>", cf::NDI_UNIQUE);
112 }
113};
114
115cf::register_command body => sub {
116 my ($ob) = @_;
117
118 # Too hard to try and make a header that lines everything up, so just
119 # give a description. (comment from C++)
120 $ob->reply (undef, "The first column is the name of the body location.");
121 $ob->reply (undef, "The second column is how many of those locations your body has.");
122 $ob->reply (undef, "The third column is how many slots in that location are available.");
123
124 for (0 .. cf::NUM_BODY_LOCATIONS - 1) {
125 $ob->reply (undef, (sprintf "%-30s %5d %5d", cf::object::slot_use_name ($_), $ob->slot_info ($_), $ob->slot_used ($_)))
126 if $ob->slot_info ($_) or $ob->slot_used ($_);
127 }
128
129 $ob->reply (undef, "You are not allowed to wear armor")
130 unless $ob->flag (cf::FLAG_USE_ARMOUR);
131 $ob->reply (undef, "You are not allowed to use weapons")
132 unless $ob->flag (cf::FLAG_USE_WEAPON);
133
134 1
135};
136
137cf::register_command mark => sub {
138 my ($pl, $arg) = @_;
139
140 if (length $arg) {
141 my $ob = $pl->find_best_object_match ($arg);
142
143 return $pl->reply (undef, "Could not find an object that matches $arg")
144 unless $ob;
145
146 $pl->contr->mark ($ob);
147 $pl->reply (undef, (sprintf "Marked item %s", $ob->name, $ob->title));
148 } else {
149 my $ob = $pl->find_marked_object;
150
151 $pl->reply (undef, $ob
152 ? (sprintf "%s %s * is marked.", $ob->name, $ob->title)
153 : "You have no marked object.");
154 }
155
156 1
157};
158
159for my $cmd ("run", "fire") {
160 my $oncmd = "${cmd}_on";
161 cf::register_command $cmd => sub {
162 my ($ob, $arg) = @_;
163
164 $ob->reply (undef, "Can't $cmd into a non adjacent square.")
165 if $arg < 0 or $arg >= 9;
166
167 $ob->contr->$oncmd (1);
168 $ob->move_player ($arg);
169
170 1
171 };
172
173 cf::register_command "${cmd}_stop" => sub {
174 my ($ob) = @_;
175
176 $ob->contr->$oncmd (0);
177
178 1
179 };
180}
181
182cf::register_command mapinfo => sub {
183 my ($ob) = @_;
184
185 my $map = $ob->map
186 or return;
187 $ob->reply (undef, (sprintf "%s (%s) %s", $map->name, $map->path, $ob->region->longname));
188 $ob->reply (undef, (sprintf "players: %d difficulty: %d size: %d start: %dx%d timeout: %d",
189 $map->players, $map->difficulty, $map->width, $map->height, $map->enter_x, $map->enter_y, $map->timeout))
190 if $ob->flag (cf::FLAG_WIZ);
191 $ob->reply (undef, $map->msg);
192
193 1
194};
195
196cf::register_command whereami => sub {
197 my ($ob) = @_;
198
199 my $reg = $ob->region;
200 $ob->reply (undef, (sprintf "You are %s.\n%s", $reg->longname, $reg->msg));
201
202 1
203};
204
205sub _set_mode($$$@) {
206 my ($name, $ob, $arg, $slot, @choices) = @_;
207
208 my $oldmode = $ob->contr->$slot;
209
210 return $ob->reply (undef, "$name is set to $choices[$oldmode]")
211 unless $arg;
212
213 my ($idx) = grep $choices[$_] eq $arg, 0 .. $#choices
214 or return $ob->reply (undef, "$name: Unknown options '$arg', valid options are @choices"), 1;
215
216 $ob->contr->$slot ($idx);
217 $ob->reply (undef, "$name" . ($oldmode == $ob->contr->unapply ? "" : " now") . " set to " . $choices[$ob->contr->$slot]);
218}
219
220cf::register_command applymode => sub {
221 my ($ob, $arg) = @_;
222
223 _set_mode "applymode", $ob, $arg, unapply => qw(nochoice never always);
224
225 1
226};
227
228cf::register_command petmode => sub {
229 my ($ob, $arg) = @_;
230
231 _set_mode "petmode", $ob, $arg, petmode => qw(normal sad defend arena);
88 232
89 1 233 1
90}; 234};
91 235
92cf::register_command usekeys => sub { 236cf::register_command usekeys => sub {
93 my ($ob, $arg) = @_; 237 my ($ob, $arg) = @_;
94 my @types = ("inventory", "keyrings", "containers");
95 my $mapping = {
96 inventory => 1,
97 keyrings => 2,
98 containers => 3,
99 };
100 238
101 my $oldtype = $ob->contr->usekeys; 239 _set_mode "usekeys", $ob, $arg, usekeys => qw(inventory keyrings containers);
102 my $oldtype_name = $types[$oldtype];
103
104 return $ob->reply (undef, "usekeys is set to $oldtype_name")
105 unless $arg;
106
107 return $ob->reply (undef, "usekeys: Unknown options '$arg', valid options are inventory, keyrings, containers")
108 unless $mapping->{$arg};
109
110 $ob->contr->usekeys ($mapping->{$arg} - 1); # HACK: because of the $mapping->{$arg} check before, where $arg should not be 0
111 # but $arg would be 0 if a user enters an incorrect value
112 $ob->reply (undef, "usekeys" . ($oldtype == $ob->contr->usekeys ? "" : " now") . " set to " . $types[$ob->contr->usekeys]);
113 240
114 1 241 1
115}; 242};
116 243
117cf::register_command afk => sub { 244cf::register_command afk => sub {
135cf::register_command brace => sub { 262cf::register_command brace => sub {
136 my ($ob, $arg) = @_; 263 my ($ob, $arg) = @_;
137 264
138 $ob->contr->braced ($ob->contr->braced ? 0 : 1); 265 $ob->contr->braced ($ob->contr->braced ? 0 : 1);
139 $ob->reply (undef, $ob->contr->braced ? "You are braced." : "Not braced."); 266 $ob->reply (undef, $ob->contr->braced ? "You are braced." : "Not braced.");
267
268 1
269};
270
271cf::register_command 'output-rate' => sub {
272 my ($ob, $arg) = @_;
273
274 return $ob->reply (undef, sprintf "Output rate is presently %dbps.", $ob->contr->ns->max_rate / $cf::TICK)
275 unless $arg > 0;
276
277 # minimum is 2k/s
278 $ob->contr->ns->max_rate ((List::Util::max 2048, $arg) * $cf::TICK);
279 $ob->reply (undef, sprintf "Output rate now set to %dbps.", $ob->contr->ns->max_rate / $cf::TICK);
280
281 1
282};
283
284cf::register_command 'output-count' => sub {
285 my ($ob, $arg) = @_;
286
287 return $ob->reply (undef, "Output count is presently " . $ob->contr->outputs_count)
288 unless $arg > 0;
289
290 $arg = 4 if $arg < 4;
291
292 $ob->contr->outputs_count ($arg);
293 $ob->reply (undef, "Output count now set to " . $ob->contr->outputs_count);
294
295 1
296};
297
298cf::register_command 'output-sync' => sub {
299 my ($ob, $arg) = @_;
300
301 return $ob->reply (undef, sprintf "Output sync time is presently %.1fs", $ob->contr->outputs_sync * $cf::TICK)
302 unless length $arg;
303
304 $arg = 0.5 if $arg < 0.5;
305
306 $ob->contr->outputs_sync ($arg / $cf::TICK);
307 $ob->reply (undef, sprintf "Output sync time now set to %.1fs", $ob->contr->outputs_sync * $cf::TICK);
140 308
141 1 309 1
142}; 310};
143 311
144# XXX: This has a bug. After one sets his wimpy level to 0 and resets it to 312# XXX: This has a bug. After one sets his wimpy level to 0 and resets it to
170 #$ob->contr->peaceful ($ob->contr->peaceful ? 0 : 1); 338 #$ob->contr->peaceful ($ob->contr->peaceful ? 0 : 1);
171 #$ob->reply (undef, $ob->contr->peaceful ? "You will attack other players." : "You will not attack other players."); 339 #$ob->reply (undef, $ob->contr->peaceful ? "You will attack other players." : "You will not attack other players.");
172 340
173 1 341 1
174}; 342};
175
176 343
177cf::register_command rename => sub { 344cf::register_command rename => sub {
178 my ($ob, $arg) = @_; 345 my ($ob, $arg) = @_;
179 346
180 $ob->speed_left ($ob->speed_left - 0.25); 347 $ob->speed_left ($ob->speed_left - 0.25);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines