ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/map_lib.ext
Revision: 1.4
Committed: Mon Feb 5 11:48:43 2007 UTC (17 years, 3 months ago) by elmex
Branch: MAIN
CVS Tags: rel-2_4, rel-2_2, rel-2_3, rel-2_0, rel-2_1, rel-2_32, rel-2_41
Changes since 1.3: +40 -0 lines
Log Message:
adjusted weapon bonuses a bit. added attachment for dialog flag detection.

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 elmex 1.4
73     =item object attachment: 'trigger_on_dialog_flag'
74    
75     This attachment checks whether the player has a specific
76     dialog flag set (the ones you can set with @setflag, see also
77     L<NPC_Dialogue>, and triggers a connection depending on that.
78    
79     The attachment has following configuration:
80    
81     =over 4
82    
83     =item flag
84    
85     This field should contain the name of the flag that you want to check
86     for.
87    
88     =item connection
89    
90     The connection ID of the connection you want to trigger.
91    
92     =item state
93    
94     The state of the connection: 0 for release, 1 for push.
95    
96     =back
97    
98     =cut
99    
100     cf::object::attachment trigger_on_dialog_flag =>
101     on_move_trigger => sub {
102     my ($self, $who, $orig) = @_;
103     my $cfg = $self->{trigger_on_dialog_flag};
104     if (exists $who->{ob}{dialog_flag}{$cfg->{flag}}) {
105     if ($who->{ob}{dialog_flag}{$cfg->{flag}}) {
106     $self->map->trigger ($cfg->{connection}, $cfg->{state});
107     }
108     cf::override;
109     }
110     };
111    
112 elmex 1.1 =back
113    
114     =cut