#
# คำแนะนำเบื้องต้น โดย pmak
# ปลั๊กอินนี้ได้รับใบอนุญาตภายใต้ the GNU GPL
# ลิขสิทธิ์ 2005 by kaliwanagan
# --------------------------------------------------
#
# วิธีการติดตั้ง..:
#
# ใน control\config.txt เพิ่ม:
#
#locationSkill skillname { # ชื่อสกิลลงพื้นที่จะใช้
# coords [x, y[, map] ] # ร่ายสกิืลในพิกัด X ,Y, map (ถ้าเป็นแบบพิกัด x และ y ให้เว้นการร่ายที่ตำแหน่งที่บอทยืน)
# whenAtCoords [x, y[, range]] # ร่ายสกิืลเมื่ออยู่ในระหว่าง พิกัด x y + หรือ - ด้วยระยะห่าง range จะร่ายสกิล ตรงที่ตัวเองยืน(เหมือน ออกนอกวงกลมแล้วจะไม่ร่าย range เหมือนรัศมี ประมาณนั้น)
# lvl [x] # lv สกิล , ถ้าไม่ระบุค่าเริ่มต้นคือ 10
# coords_whenGround # ใส่ชื่อสกิล##เมื่อพื้นที่นั้น(อ้างอิงจากจุดที่จะร่ายสกิล) มีสกิลนั่นลงอยู่ถึงจะร่ายสกิล , ร่ายสกิืลในพิกัด X ,Y, map เมื่อมีสกิลลงพื้นตรงตำแหน่งนั้น
# coords_whenNotGround #ใส่ชื่อสกิล##เมื่อพื้นที่นั้น(อ้างอิงจากจุดที่จะร่ายสกิล) ไม่มีสกิลนั่นลงอยู่ถึงจะร่ายสกิล , ร่ายสกิืลในพิกัด X ,Y, map เมื่อไม่มีสกิลลงพื้นตรงตำแหน่งนั้น
# skillDelay # ดีเลย์สกิล , ร่ายสกิลหลังจากผ่านไป n วินาที,เริ่มนับเวลาหลังจากที่ใช้สกิล(สกิลเดียวกัน)
# blockDelayBeforeUse # ร่ายสกิลหลังจากผ่านไป n seconds,นับช่วงเวลาตั้งแต่เริ่มที่ใช้สกิลนั้ , Before ก่อน ดีเลย์ก่อนใช้สกิล (หน่วยวินาที)
# blockDelayAfterUse # ร่ายสกิลหลังจากผ่านไป n seconds,นับช่วงเวลาหลังสกิลนั้ถูกใช้ , After หลัง ดีเลย์หลังใช้สกิล (หน้วยวินาที)
# hp
# sp
# onAction
# whenStatusActive
# whenStatusInactive
# whenFollowing
# spirit
# aggressives
# monsters
# notMonsters
# stopWhenHit 0
# notWhileSitting 0
# notInTown 0
# disabled 0
# inInventory
#}
use strict;
use Plugins;
use Globals;
use Log qw(message warning error);
use AI;
use Skills;
Plugins::register('locationSkill', 'cast skill at a certain location', \&Unload);
my $hook1 = Plugins::addHook('AI_post', \&call);
my $hook2 = Plugins::addHook('packet_skilluse', \&packet_skilluse);
sub Unload {
Plugins::delHook('packet_skilluse', $hook2);
Plugins::delHook('AI_post', $hook1);
}
my %skillUse;
my %delay;
sub packet_skilluse {
my (undef, $args) = @_;
my $skillID = $args->{'skillID'};
my $sourceID = $args->{'sourceID'};
my $x = $args->{'x'};
my $y = $args->{'y'};
if ($sourceID eq $accountID) {
$skillUse{$skillID} = 1;
}
}
sub call {
if (AI::action eq 'locationSkill') {
my $args = AI::args;
if ($args->{'stage'} eq 'end') {
AI::dequeue;
} elsif ($args->{'stage'} eq 'skillUse') {
main::ai_skillUse(
$args->{'handle'},
$args->{'lvl'},
$args->{'maxCastTime'},
$args->{'minCastTime'},
$args->{'x'}, $args->{'y'}
);
$args->{'stage'} = 'end';
}
}
locationSkill() if (AI::isIdle);
}
sub locationSkill {
my $prefix = "locationSkill_";
my $i = 0;
while (exists $config{$prefix.$i}) {
if ((main::checkSelfCondition($prefix.$i)) &&
main::timeOut($delay{$prefix.$i."_blockDelayBeforeUse"}) &&
main::timeOut($delay{$prefix.$i."_blockDelayAfterUse"})
) {
my $skillObj = Skills->new(name => $config{$prefix.$i});
unless ($skillObj->handle) {
my $msg = "Unknown skill name ".$config{$prefix.$i}." in $prefix.$i\n";
error $msg;
configModify($prefix.$i."_disabled", 1);
next;
}
my %skill;
($skill{'x'}, $skill{'y'}, my $map) = split / *, */, $config{$prefix.$i."_coords"};
my $pos = main::calcPosition($char);
$skill{'x'} = $skill{'x'} || $pos->{'x'};
$skill{'y'} = $skill{'y'} || $pos->{'y'};
$delay{$prefix.$i."_blockDelayBeforeUse"}{'timeout'} = $config{$prefix.$i."_blockDelayBeforeUse"};
if (!$delay{$prefix.$i."_blockDelayBeforeUse"}{'set'}) {
$delay{$prefix.$i."_blockDelayBeforeUse"}{'time'} = time;
$delay{$prefix.$i."_blockDelayBeforeUse"}{'set'} = 1;
}
$delay{$prefix.$skillObj->handle."_skillDelay"}{'timeout'} = $config{$prefix.$i."_skillDelay"};
if ($skillUse{$skillObj->id}) { # set the delays only when the skill gets successfully cast
$delay{$prefix.$skillObj->handle."_skillDelay"}{'time'} = time;
$skillUse{$skillObj->id} = 0;
}
my %range;
($range{'x'}, $range{'y'}, $range{'range'}) = split / *, */, $config{$prefix.$i."_whenAtCoords"};
my $inRange;
$inRange = (($pos->{'x'} <= ($range{'x'} + $range{'range'})) &&
($pos->{'x'} >= ($range{'x'} - $range{'range'})) &&
($pos->{'y'} <= ($range{'y'} + $range{'range'})) &&
($pos->{'y'} >= ($range{'y'} - $range{'range'})));
undef %range;
if ((checkCoordsCondition($prefix.$i."_coords",\%skill)) &&
main::timeOut($delay{$prefix.$skillObj->handle."_skillDelay"}) &&
(($inRange || (!$config{$prefix.$i."_whenAtCoords"}))) &&
(($map eq $field{'name'}) || !$map)
) {
$skill{'handle'} = $skillObj->handle;
$skill{'lvl'} = ($config{$prefix.$i."_lvl"}) || 10;
$skill{'maxCastTime'} = $config{$prefix.$i."_maxCastTime"};
$skill{'minCastTime'} = $config{$prefix.$i."_minCastTime"};
$skill{'stage'} = 'skillUse';
AI::queue('locationSkill', \%skill);
$delay{$prefix.$i."_blockDelayAfterUse"}{'timeout'} = $config{$prefix.$i."_blockDelayAfterUse"};
$delay{$prefix.$i."_blockDelayAfterUse"}{'time'} = time;
$delay{$prefix.$i."_blockDelayBeforeUse"}{'set'} = 0;
last;
}
}
$i++;
}
}
sub checkCoordsCondition {
my $prefix = shift;
my $coord = shift;
if ($config{$prefix."_whenGround"}) {
return 0 unless main::whenGroundStatus($coord, $config{$prefix."_whenGround"});
}
if ($config{$prefix."_whenNotGround"}) {
return 0 if main::whenGroundStatus($coord, $config{$prefix."_whenNotGround"});
}
return 1;
}
return 1;
หรือ Download
วิธีการติดตั้ง :
1. นำไฟล์ locationSkill.pl ไปใส่ยัง Plugins
2. ในไฟล์ control/config.txt
ใน control\config.txt เพิ่ม:
locationSkill skillname { # ชื่อสกิลลงพื้นที่จะใช้
coords [x, y[, map] ] # ร่ายสกิืลในพิกัด X ,Y, map (ถ้าเป็นแบบพิกัด x และ y ให้เว้นการร่ายที่ตำแหน่งที่บอทยืน)
whenAtCoords [x, y[, range]] # ร่ายสกิืลเมื่ออยู่ในระหว่าง พิกัด x y + หรือ - ด้วยระยะห่าง range จะร่ายสกิล ตรงที่ตัวเองยืน(เหมือน ออกนอกวงกลมแล้วจะไม่ร่าย range เหมือนรัศมี ประมาณนั้น)
lvl [x] # lv สกิล , ถ้าไม่ระบุค่าเริ่มต้นคือ 10
coords_whenGround # ใส่ชื่อสกิล##เมื่อพื้นที่นั้น(อ้างอิงจากจุดที่จะร่ายสกิล) มีสกิลนั่นลงอยู่ถึงจะร่ายสกิล , ร่ายสกิืลในพิกัด X ,Y, map เมื่อมีสกิลลงพื้นตรงตำแหน่งนั้น
coords_whenNotGround #ใส่ชื่อสกิล##เมื่อพื้นที่นั้น(อ้างอิงจากจุดที่จะร่ายสกิล) ไม่มีสกิลนั่นลงอยู่ถึงจะร่ายสกิล , ร่ายสกิืลในพิกัด X ,Y, map เมื่อไม่มีสกิลลงพื้นตรงตำแหน่งนั้น
skillDelay # ดีเลย์สกิล , ร่ายสกิลหลังจากผ่านไป n วินาที,เริ่มนับเวลาหลังจากที่ใช้สกิล(สกิลเดียวกัน)
blockDelayBeforeUse # ร่ายสกิลหลังจากผ่านไป n seconds,นับช่วงเวลาตั้งแต่เริ่มที่ใช้สกิลนั้ , Before ก่อน ดีเลย์ก่อนใช้สกิล (หน่วยวินาที)
blockDelayAfterUse # ร่ายสกิลหลังจากผ่านไป n seconds,นับช่วงเวลาหลังสกิลนั้ถูกใช้ , After หลัง ดีเลย์หลังใช้สกิล (หน้วยวินาที)
hp
sp
onAction
whenStatusActive
whenStatusInactive
whenFollowing
spirit
aggressives
monsters
notMonsters
stopWhenHit 0
notWhileSitting 0
notInTown 0
disabled 0
inInventory
}
ตัวอย่าง
locationSkill Ice Wall {
target 100 100
whenCoords gld_dun01 102 100
target_whenNotGround Ice Wall
}
locationSkill Storm Gust {
target 95 100
whenCoords gld_dun01 102 100
}