ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/map_lib.ext
Revision: 1.3
Committed: Thu Dec 21 22:41:34 2006 UTC (17 years, 5 months ago) by root
Branch: MAIN
Changes since 1.2: +1 -1 lines
Log Message:
- updated cf.pm to use a more generic and extendable syntax,
  now that it is clear that we will have multiple "attachable" objects.
  maybe bite the bullet in C++ and make attachable virtual?
- completely rework the syntax for attaching and attachments
- update all extensions

File Contents

# User Rev Content
1 elmex 1.1 #! perl
2    
3     =head1 CF+ map maker library and utilities
4    
5     =over 4
6    
7     =cut
8     # This extension loads some nice functionality for map makers
9    
10     sub rec_inv_by_slaying {
11     my ($ob, $slaying, $cb) = @_;
12     $cb->($ob) if $ob->slaying eq $slaying;
13     for my $iob ($ob->inv) { rec_inv_by_slaying ($iob, $slaying, $cb) }
14     }
15    
16     =item object attachment: 'check_inventory_on_apply'
17    
18     This attachment checks on apply whether the applyer
19     has a specific item. Currently you can only match the slaying
20     field of the inventory item of the player.
21    
22     On match the apply isn't inhibited.
23    
24     Following configuration can be supplied to this attachment:
25    
26     =over 4
27    
28     =item key_string
29    
30     This is the string that will be matched against the slaying field
31     of the inventory item of the player. The first found item will be
32     decreased by the amount that can be passed in the 'decrease_by_cnt'
33     option.
34    
35     =item decrease_by_cnt
36    
37     This is the amount the matching object will be decreased by from the inventory.
38     Default is 0 and means nothing will be removed.
39    
40     =item message_on_match
41    
42     This is the message that will printed to the player if a matching
43     object was found.
44    
45     =item message_on_nomatch
46    
47     This is the message that will printed to the player if NO matching
48     object was found.
49    
50     =back
51    
52     =cut
53    
54 root 1.3 cf::object::attachment check_inventory_on_apply =>
55 elmex 1.1 on_apply => sub {
56     my ($self, $pl) = @_;
57     my $cfg = $self->{check_inventory_on_apply};
58     my $match;
59     rec_inv_by_slaying ($pl, $cfg->{key_string}, sub {
60     my ($ob) = @_;
61     $match = $ob;
62     });
63     if ($match) {
64     $match->decrease_ob_nr ($cfg->{decrease_by_cnt}) if $cfg->{decrease_by_cnt};
65 elmex 1.2 $pl->message ($cfg->{message_on_match}, cf::NDI_UNIQUE) if defined $cfg->{message_on_match};
66 elmex 1.1 } else {
67 elmex 1.2 $pl->message ($cfg->{message_on_nomatch}, cf::NDI_RED | cf::NDI_UNIQUE) if defined $cfg->{message_on_nomatch};
68 elmex 1.1 cf::override;
69     }
70     };
71    
72     =back
73    
74     =cut