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.7 by elmex, Sat Mar 20 14:57:58 2010 UTC vs.
Revision 1.8 by elmex, Sat Mar 20 16:30:24 2010 UTC

120 } 120 }
121 cf::override; 121 cf::override;
122 } 122 }
123 }; 123 };
124 124
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
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::new ($output_arch);
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
125=item object attachment: 'display_info_window' 222=item object attachment: 'display_info_window'
126 223
127If you attach this attachment to a sign a window containing the 224If you attach this attachment to a sign a window containing the
128message will open in the client when the player applies it. 225message will open in the client when the player applies it.
129 226

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines