Перейти к содержанию

Скрипт работающий на всю пати


Рекомендуемые сообщения

Задача: есть предмет допустим щит, при надевании на чара, если он является лидером пати, то всем членам пати дается бонус. (аля аура как в Д2)

Конкретно за основу взял функцию телепорта пати в лидеру, вот что плучилось:

Исходник:

function script F_CashPartyCall2 {

warp "Random",0,0;

if(getpartyleader(getcharid(1),2) == getcharid(0)) {

getmapxy .@mapl$, .@xl, .@yl, 0;

getpartymember getcharid(1),2;

set .@partymembercount, $@partymembercount;

copyarray .@partymemberaid[0], $@partymemberaid[0], .@partymembercount;

for(set .@i, 0; .@i < .@partymembercount; set .@i, .@i + 1) {

if(attachrid(.@partymemberaid[.@i])) {

if(strcharinfo(3) == .@mapl$ && HP > 0) {

warp .@mapl$, .@xl, .@yl;

}

}

}

}

return;

}

Вот что сделал:

function script F_CashPartyCall3 {

specialeffect2 42;

if(getpartyleader(getcharid(1),2) == getcharid(0)) {

getpartymember getcharid(1),2;

set .@partymembercount, $@partymembercount;

copyarray .@partymemberaid[0], $@partymemberaid[0], .@partymembercount;

for(set .@i, 0; .@i < .@partymembercount; set .@i, .@i + 1) {

if(attachrid(.@partymemberaid[.@i])) {

bonus2 bHPRegenRate,100,1000;

}

}

}

return;

}

Какие есть проблемы со скриптом: во первых срабатывает только при одевании, а хотелось бы что бы не требовалось переодевать что бы заново на всю пати провести скрипт, во вторых работает на всю локацию, можно ли ограничить работу скрипта радиусом действия ?

И еще несколько проблем, если действием функции является допустим получение +5 декс, то работает только если один человек в пати, при количестве участников больше одного вообще не работает ни на кого:

function script F_CashPartyCall4 {

specialeffect2 42;

if(getpartyleader(getcharid(1),2) == getcharid(0)) {

getpartymember getcharid(1),2;

set .@partymembercount, $@partymembercount;

copyarray .@partymemberaid[0], $@partymemberaid[0], .@partymembercount;

for(set .@i, 0; .@i < .@partymembercount; set .@i, .@i + 1) {

if(attachrid(.@partymemberaid[.@i])) {

bonus bDex,5;

}

}

}

return;

}

Возможно мой подход к решению проблемы кривой, сначало пытался сделать оффенсив скил по примеру гильд аур, но не получилось...

  • Downvote 1
Ссылка на комментарий
Поделиться на другие сайты

Бонусы на всю группу не будут действовать. Только на того, кто одел предмет.

Вот кусок кода из знаменитого пака от Epoque

*areascript "{ script }", <range>{, <type>};

Runs the script in an area of effect around the source.

range is:

The area (in cells) around the source to run the script.

1 = 3*3 cells around the source

2 = 5*5 cells around the source

3 ... etc

type can be:

0 = attached player

1 = npc object

/*==========================================
* areascript sub-routine (runs the script)
*------------------------------------------*/
int buildin_areascript_sub(struct block_list* bl, va_list ap)
{
struct script_code* script = va_arg(ap, struct script_code*);

nullpo_retr(0, bl);
nullpo_retr(0, script);

run_script(script, 0, bl->id, 0);

return 1;
}

/*==========================================
* areascript "<script>", <area>{, <type>};
*------------------------------------------*/
BUILDIN_FUNC(areascript)
{
int area, type;
struct block_list* bl;
struct script_code* script;

script = parse_script(script_getstr(st, 2), "areascript", 0, 0);

if (script == NULL)
{
ShowError("areascript: Invalid script given.\n");
return 0;
}

area = script_getnum(st, 3);
type = (script_hasdata(st, 4) ? script_getnum(st, 4) : 0);

if (type == 0)
{
struct map_session_data* sd = script_rid2sd(st);

if (sd == NULL)
{
ShowError("areascript: Tried to run a script in range of a player, no player attached!\n");
return 0;
}

bl = &sd->bl;
}
else
bl = map_id2bl(st->oid);

if (bl == NULL)
{
ShowError("areascript: Tried to run a script in range of an object, no object found!\n");
return 0;
}

map_foreachinrange(buildin_areascript_sub, bl, area, BL_PC, script);

return 0;
}
...
BUILDIN_DEF(areascript, "si*"),

Ссылка на комментарий
Поделиться на другие сайты

Но этот скрипт работает на всю группу...

function script F_CashPartyCall3 {

specialeffect2 42;

if(getpartyleader(getcharid(1),2) == getcharid(0)) {

getpartymember getcharid(1),2;

set .@partymembercount, $@partymembercount;

copyarray .@partymemberaid[0], $@partymemberaid[0], .@partymembercount;

for(set .@i, 0; .@i < .@partymembercount; set .@i, .@i + 1) {

if(attachrid(.@partymemberaid[.@i])) {

bonus2 bHPRegenRate,100,1000;

}

}

}

return;

}

То что ты кинул не совсем понял, а куда вставлять кусок сорца...

Изменено пользователем Nezdeshniy
  • Downvote 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...
Яндекс.Метрика