Nezdeshniy Опубликовано 27 мая, 2012 Жалоба Поделиться Опубликовано 27 мая, 2012 Задача: есть предмет допустим щит, при надевании на чара, если он является лидером пати, то всем членам пати дается бонус. (аля аура как в Д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;}Возможно мой подход к решению проблемы кривой, сначало пытался сделать оффенсив скил по примеру гильд аур, но не получилось... 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Лилит Опубликовано 27 мая, 2012 Жалоба Поделиться Опубликовано 27 мая, 2012 Бонусы на всю группу не будут действовать. Только на того, кто одел предмет.Вот кусок кода из знаменитого пака от 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 ... etctype 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*"), Ссылка на комментарий Поделиться на другие сайты Поделиться
Nezdeshniy Опубликовано 27 мая, 2012 Автор Жалоба Поделиться Опубликовано 27 мая, 2012 (изменено) Но этот скрипт работает на всю группу...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;}То что ты кинул не совсем понял, а куда вставлять кусок сорца... Изменено 27 мая, 2012 пользователем Nezdeshniy 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Renegade Bastard Опубликовано 29 мая, 2012 Жалоба Поделиться Опубликовано 29 мая, 2012 code /code Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения