ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/commands.ext
Revision: 1.21
Committed: Fri Mar 2 10:43:01 2007 UTC (17 years, 2 months ago) by pippijn
Branch: MAIN
Changes since 1.20: +30 -0 lines
Log Message:
sound, usekeys in perl

File Contents

# Content
1 #! perl
2
3 use POSIX ();
4
5 # miscellaneous commands
6
7 sub rename_to($$$) {
8 my ($ob, $from, $to) = @_;
9
10 $to =~ /^[a-zA-Z0-9.,=#\/%$!^ ]*$/
11 or return $ob->message ("rename: name must consist only of letters, digits, spaces and a few other things.");
12
13 127 >= length $to
14 or return $ob->message ("rename: new name must be <= 127 characters.");
15
16 my $item;
17
18 if (length $from) {
19 $item = $ob->find_best_object_match ($from)
20 or return $ob->message ("rename: could not find a matching item to rename.");
21 } else {
22 $item = $ob->find_marked_object ()
23 or return $ob->message ("rename: no from name and no marked item found to rename.");
24 }
25
26 $item->custom_name (length $to ? $to : undef);
27
28 if (length $to) {
29 $item->custom_name ($to);
30 $ob->message ("Your " . $item->base_name . " will now be called $to.");
31 } else {
32 $item->custom_name (undef);
33 $ob->message ("You stop calling your " . $item->base_name . " with weird names.");
34 }
35
36 $ob->esrv_update_item (cf::UPD_NAME, $item);
37
38 1
39 }
40
41 sub ext::schmorp_irc::users; # HACK: TODO: replace by signal
42
43 sub who_listing(;$) {
44 my ($privileged) = @_;
45
46 my ($numwiz, $numafk) = (0, 0);
47 my @pl;
48
49 foreach my $pl (cf::player::list) {
50 my $ns = $pl->ns or next;
51 my $ob = $pl->ob;
52
53 next unless $ob->map
54 && ($privileged || !$pl->hidden);
55
56 $numwiz++ if $ob->flag (cf::FLAG_WIZ);
57 $numafk++ if $ns->afk;
58
59 push @pl, $pl;
60 }
61
62 (
63 "Total Players in The World. (" . (scalar @pl) . ") -- WIZ($numwiz) AFK($numafk) BOT(0)",
64 (
65 map {
66 my ($pl, $ob, $ns) = ($_, $_->ob, $_->ns);
67
68 "* " . $ob->name . "/" . $ob->level . " " . (length $pl->own_title ? $pl->own_title : "the " . $pl->title)
69 . ($pl->peaceful ? " [peaceful]" : " [HOSTILE]")
70 . ($ns->afk ? " [AFK]" : "")
71 . ($ob->flag (cf::FLAG_WIZ) ? " [WIZ]" : "")
72 . " [" . $pl->ns->version . "]"
73 . " [" . ($pl->peaceful || $privileged ? $ob->map->visible_name : $ob->region->name) . "]"
74 . (sprintf " [rtt %.3fs]", $pl->ns->rtt * 1e-6)
75 . ($privileged ? " " . $pl->ns->host : "")
76 } sort { (lc $a->ob->name) cmp (lc $b->ob->name) } @pl
77 ),
78 eval { "* IRC: " . join ", ", ext::schmorp_irc::users },
79 )
80 }
81
82 cf::register_command who => sub {
83 my ($ob, $arg) = @_;
84
85 $ob->speed_left ($ob->speed_left - 0.25);
86
87 $ob->reply (undef, (join "\n", who_listing $ob->may ("extended_who")), cf::NDI_UNIQUE | cf::NDI_DK_ORANGE);
88
89 1
90 };
91
92 cf::register_command usekeys => sub {
93 my ($ob, $arg) = @_;
94 my @types = ("inventory", "keyrings", "containers");
95 my $mapping = {
96 inventory => 1,
97 keyrings => 2,
98 containers => 3,
99 };
100
101 my $oldtype = $ob->contr->usekeys;
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 };
114
115 cf::register_command afk => sub {
116 my ($ob, $arg) = @_;
117
118 $ob->contr->ns->afk ($ob->contr->ns->afk ? 0 : 1);
119 $ob->reply (undef, $ob->contr->ns->afk ? "You are now AFK" : "You are no longer AFK");
120 };
121
122 cf::register_command sound => sub {
123 my ($ob, $arg) = @_;
124
125 $ob->contr->ns->sound ($ob->contr->ns->sound ? 0 : 1);
126 $ob->reply (undef, $ob->contr->ns->sound ? "The sounds are enabled." : "Silence is golden...");
127 };
128
129 cf::register_command brace => sub {
130 my ($ob, $arg) = @_;
131
132 $ob->contr->braced ($ob->contr->braced ? 0 : 1);
133 $ob->reply (undef, $ob->contr->braced ? "You are braced." : "Not braced.");
134 };
135
136 # XXX: This has a bug. After one sets his wimpy level to 0 and resets it to
137 # some other level (which may also be 0), this does not get echoed,
138 # but it does get set.
139 cf::register_command wimpy => sub {
140 my ($ob, $arg) = @_;
141
142 my $wimpy = $ob->run_away;
143 return $ob->reply (undef, "Your current wimpy level is $wimpy.")
144 if $arg eq "";
145
146 return $ob->run_away ($arg) && $ob->reply (undef, "Your new wimpy level is $arg.")
147 if $arg =~ /^\d+$/ and $arg <= 100;
148
149 $ob->reply (undef, "Incorrect parameters for wimpy: $arg");
150 };
151
152 cf::register_command peaceful => sub {
153 my ($ob, $arg) = @_;
154
155 $ob->reply (undef, "You cannot change your peaceful setting with this command."
156 ." Please speak to the priest in the temple of Gorokh"
157 ." if you want to become hostile or in temple of Valriel"
158 ." if you want to become peaceful again.");
159
160 #$ob->contr->peaceful ($ob->contr->peaceful ? 0 : 1);
161 #$ob->reply (undef, $ob->contr->peaceful ? "You will attack other players." : "You will not attack other players.");
162 };
163
164
165 cf::register_command rename => sub {
166 my ($ob, $arg) = @_;
167
168 $ob->speed_left ($ob->speed_left - 0.25);
169
170 if ($arg =~ /^\s* (?: <([^>]+)> \s+)? to \s+ <([^>]*)> \s*$/x) {
171 # compatibility syntax
172 rename_to $ob, $1, $2;
173 } elsif ($arg =~ /
174 ^\s*
175 (?:
176 (?: "((?:[^"]+|\\.)*)" | (\S+) )
177 \s+)?
178 to \s+
179 (?: "((?:[^"]+|\\.)*)" | (\S+) )
180 \s*$
181 /x) {
182 # does not unquote $1 or $3
183 rename_to $ob, $2||$1, $4||$3;
184 } else {
185 $ob->reply (undef, 'Syntax error. Rename usage: rename ["oldname"] to "newname"');
186 }
187
188 1
189 };
190
191 cf::register_command uptime => sub {
192 my ($ob, $arg) = @_;
193
194 my $startup = POSIX::strftime "%Y-%m-%d %H:%M:%S %Z", localtime $cf::UPTIME;
195 my $runtime = sprintf "%.1f", (time - $cf::UPTIME) / 86400;
196 $ob->reply (undef, "server started $startup, uptime ${runtime}\d");
197
198 1
199 };
200
201 my %IN_MEMORY = (
202 cf::MAP_IN_MEMORY => "I",
203 cf::MAP_SWAPPED => "S",
204 cf::MAP_LOADING => "L",
205 );
206
207 cf::register_command maps => sub {
208 my ($ob, $arg) = @_;
209
210 no re 'eval'; $arg = qr<$arg>;
211
212 my $format = "%2s %1s %3s %5s %.60s\n";
213
214 $ob->reply (undef, (sprintf $format, "Pl", "I", "Svd", "Reset", "Name"), cf::NDI_BLACK | cf::NDI_UNIQUE);
215
216 for (sort keys %cf::MAP) {
217 my $map = $cf::MAP{$_}
218 or next;
219
220 next unless $map->path =~ $arg;
221 next if $map->{deny_list};
222
223 my $svd = int $cf::RUNTIME - $map->{last_save};
224 $svd = "++" if $svd > 99;
225
226 $ob->reply (undef,
227 (sprintf $format,
228 (scalar $map->players),
229 $IN_MEMORY{$map->in_memory} || "?",
230 $svd,
231 (int $map->reset_at - $cf::RUNTIME),
232 $map->visible_name),
233 cf::NDI_BLACK | cf::NDI_UNIQUE);
234 }
235
236 1
237 };
238