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

Хороший эвент


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

Доброго времени суток. Хотел бы попросить выложить скрипт или наброски для эвента, о котором я стал всё чаще слышать. Примерного названия не знаю. Суть же заключается в том, чтобы зайти на арену, победить в неравном поединке с Emperium и сидеть на арене, получая через определённый промежуток времени призы. В это время естественно нужно защищать свой Emperium, ведь если он падёт от рук другого игрока, Вы вылетаете с арены и призов не получаете.

Сразу уточню, не стоит говорить мне про google.ru, либо eathena.ws - искал.

И ещё, не нужно говорить мол "Пиши сам!" либо "Ты что, идиот!? Это авторский скрипт, который стоит десятки миллиардов долларов!!!".

Я уверен что скрипт находится в общем пользовании, т.к. мои знакомые видели его и на средних, и на совсем дохлых нубо - серверах.

Спасибо.

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

Появилось пару вопросов:

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

Я конечно порылся и в agit_template.txt и на eathena.ws , но результата не дало.

2. Как реализовать, чтобы атаку нельзя было производить с помощью скиллов?

mapflag noskill

Не помогло.

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

Запрет на атаку делается в eA/src/map/battle.c в этой функции(battle_check_target),а именно в этом куске:

switch( t_bl->type )
{ //Checks on target master

Чуть ниже есть такая строчка:

case BL_MOB:

После этого кейса можешь добавить свою проверку на наличие переменной/статуса/стейта,смотря что вешается у тебя при убийстве импа.

А вообще,чтобы имп работал идеально(как на гв) нужно сделать такие моменты:

1) Локация должна быть замком(нужно поставить мапфлаг "gvg_castle" и занести локацию в eA/db/castle_db.txt).

2) Должно быть включено WoE или должен стоять мапфлаг "gvg".

3) В battle.c нужнно найти это:

if (!(agit_flag && map[m].flag.gvg_castle) && md->guardian_data && md->guardian_data->guild_id)

И заменить на это:

if (!((agit_flag || map[m].flag.gvg) && map[m].flag.gvg_castle) && md->guardian_data && md->guardian_data->guild_id)

Там таких куска 2 => нужно 2 раза заменить.

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

Разницы никакой нету,в моем посте просто вариант старый,в котором еще WoE2 не было.

Вот для новых:

Эту строчку:

if( !((agit_flag || agit2_flag) && map[m].flag.gvg_castle) && md->guardian_data && md->guardian_data->guild_id )

Заменяем на эту:

if( !((agit_flag || agit2_flag || map[m].flag.gvg ) && map[m].flag.gvg_castle) && md->guardian_data && md->guardian_data->guild_id )

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

Ну так проверка никакая не добавлялась в battle.c.

А вообще нужно еще в скрипт добавить 'setcastledata'.Имп арена должна быть мини-вое эвентом => в скрипте должно быть несколько кусков из agit_template.txt

Если говорить о банальной реализации с проверкой на переменную то это будет так:

При разбитии импа вешаем на чара переменную:

set myemp,1;

При смерте(OnPCDieEvent) или при при выходе из игры(OnPCLogoutEvent) обнуляем переменную:

set myemp,0;

Ну а в battle_check_target в BL_MOB(Checks on target master) после такой строчки:

struct mob_data *md = BL_CAST(BL_MOB, t_bl);

Вставляем это:

struct map_session_data *sd;
sd = BL_CAST(BL_PC, s_bl);

Ну и добавляем проверку:

if(t_bl->type==BL_MOB && ((TBL_MOB*)target)->class_== ID монстра && pc_readregistry((TBL_PC*)s_bl,"myemp",3)==1) return 0;

Теперь если на чаре будет висеть переменная myemp со значением 1,то он не сможет бить моба с указанным ID.

----

P.S:

Вот посмотри еще такой скриптик:

guild_vs4.gat,0,0,0 script Agit_AW01 -1,{

OnInit:
callfunc "F_BtStart","guild_vs4","AW01",50,50;
end;
OnImpBreak:
callfunc "F_BtBreak","guild_vs4","AW01";
end;
}

prontera,97,172,4 script Arena War::GvGArena 722,{
mes "[^770000Arena War^000000]";
mes "Арена принадлежит гильдии: ^FF0000"+$GvG_Owner$+"^000000";
close2;
end;

OnGvGRecive:
FlagEmblem GetCastleData("guild_vs4",1);
end;
}

function script F_BtStart {
MapRespawnGuildID getarg(0),GetCastleData(getarg(0),1),2;
killmonsterall getarg(0);
if (!mobcount(getarg(0),"Agit_"+getarg(1)+"::OnImpBreak")) {
monster getarg(0),getarg(2),getarg(3),"Emperium",1288,1,"Agit_"+getarg(1)+"::OnImpBreak";
}
}

// Function for OnAgitBreak ======================================
function script F_BtBreak {
killmonsterall getarg(0);
set .@GID,getcharid(2);
if (.@GID <= 0) {
set $GvG_Owner$, "None";
set $GvG_Owner_id, 0;
donpcevent "GvGArena::OnGvGRecive";
callfunc "F_BtStart","guild_vs4","AW01",50,50;
return 0;
}

// Lower castle Economy
set .@Economy,GetCastleData("guild_vs4",2) - 5;
if (.@Economy < 0) set .@Economy, 0;
SetCastleData "guild_vs4", 2, .@Economy;
// Lower Castle Defence
set .@Defence,GetCastleData("guild_vs4",3) - 5;
if (.@Defence < 0) set .@Defence, 0;
SetCastleData "guild_vs4", 3, .@Defence;
// Set new owner
SetCastleData "guild_vs4",1, .@GID;
// Clear castle's data.
for( set .@i, 4; .@i <= 9; set .@i, .@i+1 )
SetCastleData "guild_vs4", .@i, 0;

GetCastleData "guild_vs4",0,"::OnGvGRecive";

set $GvG_Owner$, strcharinfo(2);
set $GvG_Owner_id, @GID;
donpcevent "GvGArena::OnGvGRecive";
sleep getbattleflag("gvg_eliminate_time");
MapAnnounce "guild_vs4","Гильдия ["+$GvG_Owner$+"] сломали империум.",17;
callfunc "F_BtStart","guild_vs4","AW01",50,50;
sleep2 500;
MapAnnounce "guild_vs4","Арену взял [" + strcharinfo(0) + "].",17;
announce "Арену [Arena War] взяла гильдия ["+$GvG_Owner$+"].",0;
end;
}

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

  • 2 недели спустя...

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

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

Меняем в коде Agasrepa

monster getarg(0),getarg(2),getarg(3),"Emperium",1288,1,"Agit_"+getarg(1)+"::OnImpBreak";

на

monster getarg(0),getarg(2),getarg(3),.guild$,1288,1,"Agit_"+getarg(1)+"::OnImpBreak";

сюда добавляем строчки


OnImpBreak:
set .guild$,strcharinfo(2);
set .charguildi$, getcharid(2);
maprespawnguildid "guild_vs4",.charguildi$,2;
callfunc "F_BtBreak","guild_vs4","AW01";
end;
}

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

  • 1 месяц спустя...

какую команду прописать что-бы всех играков выкидовало в пронту кроме согильдийцев!

и 2 вопрос! в етом скрипте не даёт приз за удержание! нужно что-бы желательно всей гильдии давало приз через 20 мин примерно!

-       script  emp_arena       -1,{
OnInit:
monster "Карта",0,0,"Империум",1288,1,"emp_arena::OnEMP";
end;
OnEMP:
monster "Карта",0,0,strcharinfo(0),1288,1,"emp_arena::OnEMP";
announce "Игрок "+strcharinfo(0)+" захватил Империум Арену!",0;
set $@emp_owner$,strcharinfo(0);
initnpctimer;
end;
OnTimer5000:
if($@emp_owner$=="none"){ killmonsterall "Карта"; monster "Карта",0,0,"Империум",1288,1,"emp_arena::OnEMP"; end; }
if(!getcharid(0,$@emp_owner$)){ stopnpctimer; set $@emp_owner$,"none"; end;
} else {
attachrid(getcharid(3,$@emp_owner$));
getmapxy .@empmap$,.@x,.@y,0;
if(.@empmap$ == "Карта"){ getitem 7227,1; initnpctimer; end; }
}
end;
OnPCLogoutEvent:
if(strcharinfo(0)==$@emp_owner$){
killmonsterall "Карта";
monster "Карта",0,0,"Империум",1288,1,"emp_arena::OnEMP";
stopnpctimer;
set $@emp_owner$,"none";
}
end;
}

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

Вообще-то даёт приз :

if(.@empmap$ == "Карта"){ getitem 7227,1; initnpctimer; end; } 

Просто если немного подумать, то вместо слова Карта нужно поставить название арены ( Например, guild_vs2 ) и приз будет даваться.

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

  • 2 недели спустя...

можно ещё вопрос может не по теме но всё же!

Как включить статусы!

Стан Курс и Слип а то на мобов стан действует а на игроков неть((

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

Может быть у вас максимальные статы слишком большие и следовательно у игроков резист? Если да - правьте формулы наложения статусов.

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

Т.к. сервер у тебя с уровнями 1000, то естественно на все статусы, типа Sleep, Stun и т.д. действует резист.

Правь формулы.

src/map/status.c

Начиная с :

case SC_STUN:
case SC_POISON:
case SC_DPOISON:
case SC_SILENCE:
case SC_BLEEDING:
sc_def = 3 +status->vit;

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

Ну сам смотри...

case SC_STUN:
case SC_POISON:
case SC_DPOISON:
case SC_SILENCE:
case SC_BLEEDING:
sc_def = 3 +status->vit;

//

sc_def = 3 +status->vit;

Следовательно резист идёт из расчёта 3 + показатель Vit пользователя.

Формула анти - Stun 3 + 97 vit ( Тоесть 97 Vit достаточно, чтобы статус перестал действовать. )

Ну и теперь считай. Чтобы при 999 Vit был анти - статус, то нужно сменить формулу на :

sc_def = 1 +status->vit/10;

Итак, считаем : 1 + 999/10 = 1 + 99 = 100% Resistance.

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

а для 1к? Извени за глупость можно их ваше включить и не выключать то есть сколько не качал виты он не вырубится ,а эта строка отвечает за все статусы?

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

Для 1000 нужно делить так :

sc_def = 10 +status->vit/11;

Итак, считаем : 1000/11 + 10 = 90.9 + 10 = 100%

Если статусы не будут пропадать после прокачивания максимального значения Vit игроки будут ныть, знаю по собственному опыту. Придётся делать.

а эта строка отвечает за все статусы

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

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

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