Назад

ПвП Рейтинг

Автор: Sanasol: Дата: 12.09.2010

Самый простой из возможных пвп рейтингов.

Сколько убил, столько рейтинга и наоброт.

1. Добавить в таблицу char 2 поля kills и dies. Тип int(числовые) Длина как хотите.
2. Ставите скрипт
3. Учите игроков разговаривать с НПЦом
4. Ставите Рейтинг на сайте.

Скрипт:

/*
by Sanasol
*/
- script pvp_rate -1,{

OnPckillEvent:
set kills,kills+1;
dispbottom "Вы убили персонажа "+rid2name(killedrid)+", у вас "+kills+" убийств";
end;

OnPcDieEvent:
if(killerrid == getcharid(0)) end;
set dies,dies+1;
dispbottom "Вас убил персонаж "+rid2name(killerrid)+", у вас "+dies+" смертей";
end;

OnPCLoginEvent:
query_sql("update `char` set `dies`='"+dies+"' where char_id='"+getcharid(0)+"'");
query_sql("update `char` set `kills`='"+kills+"' where char_id='"+getcharid(0)+"'");
end;

OnWhisperGlobal:
if (@whispervar0$ == "стат") {
dispbottom "Информация: Убийств "+kills+", Смертей "+dies+"";
}
if (@whispervar0$ == "топ") {
dispbottom "-----ПвП Топ Игроков----";
query_sql "SELECT `name`,`kills`,`dies` FROM `char` ORDER BY `kills` DESC LIMIT "+@whispervar1$+"", @name$, @kills, @dies;
set $limit,@whispervar1$;
dispbottom "Ник || Убийств || Смертей";
for(set @i,0; @i != $limit; set @i,@i+1) { dispbottom ""+(@i+1)+" | "+@name$[@i]+" | "+@kills[@i]+" | "+@dies[@i]+""; }
}

if (@whispervar0$ == "инфо") {
dispbottom "Чтобы узнать вашу статистику напишите 'стат'";
dispbottom "Чтобы посмотреть топ игроков напишите 'топ#цифра', Цифра - сколько игроков в топе показать. например 'топ#5' выведет Топ 5 игроков";
}

end;
}


Скрипт для сайта:

$host = "1111111111111";
$user = "casdasd";
$password = "asdasd";
$rodb = "asdasd";
$job['0']= "Novice";
$job['1']= "Swordman";
$job['2']= "Magician";
$job['3']= "Archer";
$job['4']= "Acolyte";
$job['5']= "Merchant";
$job['6']= "Thief";
$job['7']= "Knight";
$job['8']= "Priest";
$job['9']= "Wizard";
$job['10']= "Blacksmith";
$job['11']= "Hunter";
$job['12']= "Assassin";
$job['13']= "Knight (Peco)";
$job['14']= "Crusader";
$job['15']= "Monk";
$job['16']= "Sage";
$job['17']= "Rogue";
$job['18']= "Alchemist";
$job['19']= "Bard";
$job['20']= "Dancer";
$job['21']= "Crusader (Peco)";
$job['22']= "Wedding";
$job['23']= "Super Novice";
$job['24']= "Gunslinger";
$job['25']= "Ninja";
$job['4001']= "Novice High";
$job['4002']= "Swordman High";
$job['4003']= "Magician High";
$job['4004']= "Archer High";
$job['4005']= "Acolyte High";
$job['4006']= "Merchant High";
$job['4007']= "Thief High";
$job['4008']= "Lord Knight";
$job['4009']= "High Priest";
$job['4010']= "High Wizard";
$job['4011']= "Whitesmith";
$job['4012']= "Sniper";
$job['4013']= "Assassin Cross";
$job['4014']= "Lord Knight (Peco)";
$job['4015']= "Paladin";
$job['4016']= "Champion";
$job['4017']= "Professor";
$job['4018']= "Stalker";
$job['4019']= "Creator";
$job['4020']= "Clown";
$job['4021']= "Gypsy";
$job['4022']= "Paladin (Peco)";
$job['4023']= "Baby Novice";
$job['4024']= "Baby Swordman";
$job['4025']= "Baby Magician";
$job['4026']= "Baby Archer";
$job['4027']= "Baby Acolyte";
$job['4028']= "Baby Merchant";
$job['4029']= "Baby Thief";
$job['4030']= "Baby Knight";
$job['4031']= "Baby Priest";
$job['4032']= "Baby Wizard";
$job['4033']= "Baby Blacksmith";
$job['4034']= "Baby Hunter";
$job['4035']= "Baby Assassin";
$job['4036']= "Baby Knight (Peco)";
$job['4037']= "Baby Crusader";
$job['4038']= "Baby Monk";
$job['4039']= "Baby Sage";
$job['4040']= "Baby Rogue";
$job['4041']= "Baby Alchemist";
$job['4042']= "Baby Bard";
$job['4043']= "Baby Dancer";
$job['4044']= "Baby Crusader (Peco)";
$job['4045']= "Baby Super Novice";
$job['4046']= "Taekwon";
$job['4047']= "Star Knight";
$job['4048']= "Star Knight (flying)";
$job['4049']= "Soul Linker";

$num=0;
$db = mysql_connect ($host,$user,$password);
mysql_select_db($rodb,$db);
$result = mysql_query ("SELECT * FROM `char` ORDER BY `kills` DESC LIMIT 10 ",$db) or die(mysql_error());
$myrow = mysql_fetch_array($result);
mysql_query("SET SESSION CHARACTER SET utf-8");
mysql_query("SET NAMES utf-8");

echo "







";
do
{
$num=$num+1;
printf("








" ,$myrow["name"] ,$myrow["base_level"],$myrow["job_level"] ,$myrow["kills"] ,$myrow["dies"], $myrow["class"]);
}
while ($myrow = mysql_fetch_array($result));

echo "
Ник Б.лвл/Дж.лвл Убийств Смертей Профессия
$num %s %s/%s %s %s ".$job[$myrow["class"]]."
";


?>


Диалог с игроком:

При помощи привата

На какой ник писать?
npc:pvp_rate


Что писать?
"инфо"


Например:
Кому: npc:pvp_rate 
Сообщение: инфо

Результат работы сообщения ИНФО на 2 скриншоте.



Автор: [Гудвин]: Дата: 12.22.2010

http://www.youtube.com/watch?v=j9a6wmIxkwg

Автор: gmden: Дата: 12.27.2010

Хм а где резет? Из какого файла записываются данные в kills и dies. Вырубаю серв вручную в дб изменяю все kills и dies на 0 запускаю пишу стат отвечает что смертей 20 убийств 23 пере зашел и опять в kills и dies стоят 20 и 23

Автор: [OneLife]: Дата: 12.27.2010

OnPckillEvent: 
set kills,kills+1;
dispbottom "Вы убили персонажа "+rid2name(killedrid)+", у вас "+kills+" убийств";
end;

OnPcDieEvent:
if(killerrid == getcharid(0)) end;
set dies,dies+1;
dispbottom "Вас убил персонаж "+rid2name(killerrid)+", у вас "+dies+" смертей";
end;

.....

Автор: gmden: Дата: 12.27.2010

Это понятно это в db char kills и dies а куда предварительно пишет? или как зделать чтобы был полный резет ?

Меня больше интересует
OnWhisperGlobal:
if (@whispervar0$ == "стат") {
dispbottom "Информация: Убийств "+kills+", Смертей "+dies+"";

Автор: gmden: Дата: 12.27.2010

Я так понимаю что Инфа хранится где то в eAthena, а из неё при входи выходи чара копируется в db char kills и dies.

Автор: [OneLife]: Дата: 12.27.2010

Цитата gmden;28353:
Я так понимаю что Инфа хранится где то в eAthena, а из неё при входи выходи чара копируется в db char kills и dies.


Хренова понимаешь.

Автор: gmden: Дата: 12.27.2010

Ну так объясни если не трудно. Я просто не могу понять откуда скрипт берёт значения. Я думаю что из query_sql но немогу его найти
OnPCLoginEvent:
query_sql("update `char` set `dies`='"+dies+"' where char_id='"+getcharid(0)+"'");
query_sql("update `char` set `kills`='"+kills+"' where char_id='"+getcharid(0)+"'");
end

Автор: [OneLife]: Дата: 12.27.2010

Цитата gmden;28355:
Ну так объясни если не трудно. Я просто не могу понять откуда скрипт берёт значения. Я думаю что из query_sql но немогу его найти
OnPCLoginEvent:
query_sql("update `char` set `dies`='"+dies+"' where char_id='"+getcharid(0)+"'");
query_sql("update `char` set `kills`='"+kills+"' where char_id='"+getcharid(0)+"'");
end


Еще раз повторяю, хреново думаешь.
Подсказка global_reg_value.

Автор: Den007: Дата: 12.27.2010

в global_reg_value нашел 2 таблици killerrid и killedrid но изменения их не дало результатов(Я их даже переименовывал) но после пере захода персонажа всеравно восстанавливаются таблицы kills и dies (Их я тоже на 0 изменял)

Автор: SupR1g: Дата: 02.11.2011

Не многим игрокам нравится подобный способ узнать свой рейтинг, поэтому посидел, взял за основу 2х нпс, объединил, вот что получилось...всё работает, но есть 1 "НО", хочу чтоб ещё и в меню "Мой статус" отображалось место в топе...подскажете?


[HTML]Prontera,94,91,4 script Рейтинг PvP 857,{
mes "[PvP Инфо]";
mes "В рейтинге вы можете увидеть:";
mes "^FF0000Лидеров PvP.^000000";
mes "^42aaffСвой статус PvP.^000000";
next;
switch(select("^FF0000Лидеры PvP^000000","^42aaffМой статус^000000","Выход")) {
case 1:
set $limit, 100; //Топ#100...
query_sql "SELECT `name`,`kills`,`dies` FROM `char` ORDER BY `kills` DESC LIMIT 100", @name$, @kills, @dies;
mes "[ ^ff0000Топ "+$limit+"^000000 ]";
mes "^0000FF[Имя]^000000 - ^FF0000Убийств^000000 - ^42aaffСмертей^000000";
mes "========================";
for (set @i,0; @i != $limit; set @i,@i+1) {
mes "["+(@i+1)+"] ^0000FF["+@name$[@i]+"]^000000 - ^FF0000"+@kills[@i]+"^000000 - ^42aaff"+@dies[@i]+"^000000";
}
close2;
break;
case 2:
mes "[ PvP Статус: ^0000ff"+strcharinfo(0)+"^000000 ]";
mes "^FF0000Убийств^000000: ^0000FF"+kills+"^000000";
mes "^42aaffСмертей^000000: ^0000FF"+dies+"^000000";
close2;
break;
case 3:
close2;
break;
}
end;
}[/HTML]

Автор: Jarek: Дата: 02.11.2011

Ну я думаю можно как-то так:

query_sql "SELECT `name` FROM `char` ORDER BY `kills` DESC LIMIT 100", @name$;
for (set @i,0; @i != $limit; set @i,@i+1) {
if(@name$[@i]==strcharinfo(0)){
set @found,1;
break;
}
if(@found){
set @found,0;
mes "Ваше место в топе: "+@i+1;
}
else mes "Вы занимаете слишком низкое место в топе";

Кстати, можно лимит поднять до 127, если очень много игроков

Автор: SupR1g: Дата: 02.14.2011

попробую (= спасибо (=

Автор: DeadFull: Дата: 03.01.2011

Есть такой вопросик, команду @die сразу пишется вас убил null или @nuke, а вот как сделать чтобы из-за этих команд кол-во смертей не считалось?

Автор: Jarek: Дата: 03.01.2011

Заменить проверку?

OnPcDieEvent:
if((killerrid == getcharid(0)) || !killerrid) end;

Автор: DeadFull: Дата: 03.01.2011

спс Jarek

Автор: DeadFull: Дата: 03.01.2011

А вот еще 1 прикол а от мобов как сделать чтобы смерти несчитались=)

Автор: DeadFull: Дата: 03.01.2011

гыыы добавил !killerrmobid и все заработало хД

Автор: DeadFull: Дата: 03.01.2011

Пардон все работает=) запутался проста=)

Автор: DeadFull: Дата: 03.02.2011

Цитата Jarek;35038:
Заменить проверку?
OnPcDieEvent:
if((killerrid == getcharid(0)) || !killerrid) end;

Вот все как ты написал сделал действительно все нормалек @die несчитается, но весте с эти и вообще смертей нет тоесть кого нибудь из челов даже если убиваешь смерти не считаются. Как это исправить?

Автор: DeadFull: Дата: 03.02.2011

Вообщем как сделать так чтобы на гв на пвп считались и смерти и килы и чтобы не считались килы таки как @die или @nuke (а то евент цыпленка врубишь тык тама все подохнут раз по 100 и что же это за пвп рейтинг тогда), и соответственно несчитались килы от мобов.

Автор: dimjke: Дата: 03.02.2011

if ( getcharid(3) == killerrid ) end;

Автор: DeadFull: Дата: 03.02.2011

А зачем мне проверка аккаунта

Автор: DeadFull: Дата: 03.02.2011

getcharid(3) это же проверка аккаунта

Автор: dimjke: Дата: 03.02.2011

И что с того? У меня так всё прекрасно работает.

Даже недавно эту тему поднимал: http://rus-ea.ru/showthread.php?t=3549

Автор: DeadFull: Дата: 03.02.2011

ЩАС ПОПРОБУЮ

Автор: DeadFull: Дата: 03.02.2011

ну вот попробовал и все равно вводишь @die и смерть защитывается=)

Автор: Jarek: Дата: 03.02.2011

DeadFull, еще один дабл пост и получите нарушение.

getcharid(3) == killerrid

Это проверка на самоубийство скиллом и @nuke

!killerrid
проверка на @die

Автор: S2pidsMan: Дата: 03.03.2011

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








include('config.php');
$Query = mysql_query("SELECT * FROM `pvp_arenas` order by `matou` DESC, `morreu` DESC LIMIT 5;");
for($i=0;$i $rank = $i+1;
$Array = mysql_fetch_row($Query);
$acc = mysql_query("SELECT * FROM `pvp_arenas` WHERE nome='".$Array['nome']."';");
$mysl = mysql_fetch_array($acc);
if($mysl['level'] <= "10"){
?>









 
Имя
Убийств
Смертей










Заменяю на :
include('config.php');
$Query = mysql_query("SELECT * FROM `char` order by `kills` DESC, `dies` DESC LIMIT 5;");
for($i=0;$i $rank = $i+1;
$Array = mysql_fetch_row($Query);
$acc = mysql_query("SELECT * FROM `char` WHERE nome='".$Array['name']."';");
$mysl = mysql_fetch_array($acc);
if($mysl['level'] <= "10"){
?>


















И вижу данное:

Автор: gmden: Дата: 04.26.2011

Скрипт поставил норм. Но фраги не засчитываются. Я помню гдето нужно SRC подправить. Видел на eathena, но потерял немогу найти подскажите кто знает что нужно подправить.

Автор: Sanasol: Дата: 04.26.2011

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

Автор: gmden: Дата: 04.26.2011

Цитата Sanasol;39877:
При чем тут исходники.
В базу пишется не каждый фраг, а при входу в игру обновляется в базе.


Блин говарю ж что не засчитываются убил кучу игроков в игре постоянно пишется убил стокото. А на сайте всё по 0. Если вручную пишешь в килл в бд то и на сайте появляется. То есть не переносятся в бд. Я помню гдето что то нужно увеличить в сорсах и всё а где не помню.

Автор: Кеник: Дата: 04.26.2011

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

Читай до понимания...

Автор: gmden: Дата: 06.07.2011

Подскажите как поставить проверку на смертность от мобов? А то В евенте с МВП мобами, люди дохнут раз по 100, и смертность ппц как растет.

Автор: Sanasol: Дата: 06.07.2011

Надо всё делать в OnPCKillEvent.

Без использования OnPCDie

Автор: gmden: Дата: 06.07.2011

Да дело не в этом + ещё люди же качаются, умирают от мобов, смертность тоже растет, как сделать так чтобы вообще от мобов смертность не росла.

Автор: Sanasol: Дата: 06.07.2011

прочитай предыдущий пост

Автор: gmden: Дата: 06.07.2011

Я нечё не догоняю причём тут (Надо всё делать в OnPCKillEvent.)
Я прошу какую проверку поставить вот например

if ( getcharid(3) == killerrid ) end; это от @nuke

if((killerrid == getcharid(0)) || !killerrid) end; это от @die

как будет от мобов?

Автор: Jarek: Дата: 06.08.2011

Ну если вы такой упертый и не хотите делать по-человечески,то:
if((killerrid >1000) and (killerrid < 2500)) end;

P.S.: Почему у вас в проверках от nuke и от die берутся разные ID?

rid = account id

Автор: Sanasol: Дата: 06.08.2011

Jarek, такой вариант не работает

if((killerrid >1000) and (killerrid < 2500)) end;
(киллеррид у монстра на сервере примерно такой: 200132165497745)

Поэтому я и написал как надо.

Автор: Jarek: Дата: 06.08.2011

А ну да, забыл. После того и не работает

Автор: S2pidsMan: Дата: 07.01.2011

Апну тему.
Так какую там проверку нужно, что-бы от мобов не засчитывалось смерть?)

Автор: Sanasol: Дата: 07.01.2011

OnPckillEvent: 
if(rid2name(killedrid) == strcharinfo(0)) end;
set kills,kills+1;
dispbottom "Вы убили персонажа "+rid2name(killedrid)+", у вас "+kills+" убийств";

//killed
attachrid killedrid;
if(rid2name(killerrid) == strcharinfo(0)) end;
if(killerrid == null) end;
set dies,dies+1;
dispbottom "Вас убил персонаж "+rid2name(killerrid)+", у вас "+dies+" смертей";

end;