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

Comparing deliantra/server/ext/map_lib.ext (file contents):
Revision 1.4 by elmex, Mon Feb 5 11:48:43 2007 UTC vs.
Revision 1.9 by elmex, Mon Mar 22 18:16:38 2010 UTC

9 9
10sub rec_inv_by_slaying { 10sub rec_inv_by_slaying {
11 my ($ob, $slaying, $cb) = @_; 11 my ($ob, $slaying, $cb) = @_;
12 $cb->($ob) if $ob->slaying eq $slaying; 12 $cb->($ob) if $ob->slaying eq $slaying;
13 for my $iob ($ob->inv) { rec_inv_by_slaying ($iob, $slaying, $cb) } 13 for my $iob ($ob->inv) { rec_inv_by_slaying ($iob, $slaying, $cb) }
14}
15
16=item count_linked ($map, $connected)
17
18Counts the number of objects with the connected value C<$connected> on
19the map C<$map>.
20
21=cut
22
23sub count_linked {
24 my ($map, $connected) = @_;
25 my (@a) = $map->find_link ($connected);
26 scalar @a
14} 27}
15 28
16=item object attachment: 'check_inventory_on_apply' 29=item object attachment: 'check_inventory_on_apply'
17 30
18This attachment checks on apply whether the applyer 31This attachment checks on apply whether the applyer
59 rec_inv_by_slaying ($pl, $cfg->{key_string}, sub { 72 rec_inv_by_slaying ($pl, $cfg->{key_string}, sub {
60 my ($ob) = @_; 73 my ($ob) = @_;
61 $match = $ob; 74 $match = $ob;
62 }); 75 });
63 if ($match) { 76 if ($match) {
64 $match->decrease_ob_nr ($cfg->{decrease_by_cnt}) if $cfg->{decrease_by_cnt}; 77 $match->decrease ($cfg->{decrease_by_cnt}) if $cfg->{decrease_by_cnt};
65 $pl->message ($cfg->{message_on_match}, cf::NDI_UNIQUE) if defined $cfg->{message_on_match}; 78 $pl->message ($cfg->{message_on_match}, cf::NDI_UNIQUE) if defined $cfg->{message_on_match};
66 } else { 79 } else {
67 $pl->message ($cfg->{message_on_nomatch}, cf::NDI_RED | cf::NDI_UNIQUE) if defined $cfg->{message_on_nomatch}; 80 $pl->message ($cfg->{message_on_nomatch}, cf::NDI_RED | cf::NDI_UNIQUE) if defined $cfg->{message_on_nomatch};
68 cf::override; 81 cf::override;
69 } 82 }
107 } 120 }
108 cf::override; 121 cf::override;
109 } 122 }
110 }; 123 };
111 124
112=back
113 125
126=item object attachment: 'ratelimit_converter'
127
128This is an attachment that allows a converter to be ratelimited in terms of
129items per hour.
130
131The attachment has following configuration:
132
133=over 4
134
135=item match
136
137This field should contain a L<cf::match> match string, that should match the
138input object.
139
140=item generate_arch
141
142This field should contain the archetype name of the output.
143
144=item items_per_hour
145
146This field should contain the number of items to generate at maximum per hour.
147Default is: 20
148
149=item converter_tag
150
151This is the tag of the converter, it should be unique per converter. You can
152also use this to make the limit hit for multiple converters.
153
154=item msg
155
156This is the message when the player successfully converted.
157
158=item failmsg
159
160This is the failure message, which will be presented to the player when he hits
161the rate limit.
162
163=back
164
114=cut 165=cut
166
167cf::object::attachment ratelimit_converter =>
168 on_drop_on => sub {
169 my ($self, $obj, $who) = @_;
170
171 my $cfg = $self->{ratelimit_converter};
172
173 my $output_arch = $cfg->{generate_arch};
174 my $match = $cfg->{match};
175 my $mitems = $cfg->{items_per_hour} || 20;
176 my $tag = 'ratelimit_converter_' . $cfg->{converter_tag};
177
178 return unless cf::match::match $match, $obj;
179
180 my $items = $mitems;
181
182 if (!$who->flag (cf::FLAG_WIZ) && defined $who->{$tag . '_ts'}) {
183 my $itemtime = time - $who->{$tag . '_ts'};
184 if ($itemtime < 3600) {
185 $items = int ($items * ($itemtime / 3600));
186 }
187 }
188
189 my $nr = $obj->nrof ? $obj->nrof : 1;
190 $nr = $items if $nr > $items;
191
192 if ($nr > 0) {
193 $obj->decrease ($nr);
194
195 my $out = cf::object::generate ($output_arch, $self);
196 $out->nrof ($nr);
197 $out->insert_at ($self, $self);
198
199 if ($nr >= $mitems) {
200 $who->{$tag . '_ts'} = time;
201 } else {
202 # give player credit for the unused refills.
203 $who->{$tag . '_ts'} =
204 time - int ((($items - $nr) * 3600) / $mitems);
205 }
206
207 $who->message ($cfg->{msg})
208 if $cfg->{msg} ne '';
209 } else {
210 if ($who->contr) {
211 $who->contr->failmsg ($cfg->{failmsg})
212 if $cfg->{failmsg} ne '';
213 }
214 }
215
216 if ($who->flag (cf::FLAG_WIZ)) {
217 delete $who->{$tag . '_ts'};
218 }
219 };
220
221
222=item object attachment: 'display_info_window'
223
224If you attach this attachment to a sign a window containing the
225message will open in the client when the player applies it.
226
227Use this feature with care, as popups usually are very noisy.
228This is mostly thought for tutorial or other instructions.
229
230=cut
231
232cf::object::attachment display_info_window =>
233 on_apply => sub {
234 my ($self, $pl) = @_;
235
236 return unless $pl->contr->ns->{can_widget};
237
238 my $cfg = $self->{display_info_window};
239
240 if ($pl->contr->ns->{info_wins}->{$self->uuid}) {
241 $pl->contr->ns->{info_wins}->{$self->uuid}->destroy;
242 }
243
244 my $ws = $pl->contr->ns->new_widgetset;
245
246 my $w = $ws->{my_main} = $ws->new (Toplevel =>
247 force_w => 600,
248 force_h => 400,
249 x => 'center',
250 y => 'center',
251 title => 'Information Sign',
252 has_close_button => 1,
253 on_delete => sub { $ws->destroy },
254 );
255 $w->add ($ws->{txt_area} = $ws->new ('TextScroller'));
256 $ws->{txt_area}->add_paragraph ($self->msg);
257 $w->show;
258 $pl->contr->ns->{info_wins}->{$self->uuid} = $ws;
259
260 cf::override 1;
261 };
262
263=back
264
265=cut

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines