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

Пвп рейтинг


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

Всем привет, нашёл в интернете старый пвп рейтинг by Empty. Вроде как всё собрал, ерроры которые выдавал мап сервер исправил, но пвп рейтинг всё равно не правильно работает, не понимаю в чем проблема.

Сам скрипт:

//////////////////////////////////////////////////////////////

//===== eAthena Script =======================================

// PvP Rating System

//===== By: ==================================================

// Empty (aka F4nT)

//===== Current Version: =====================================

// 2.1a

//===== Compatible With: =====================================

// SQL eAthena version

//===== Description: =========================================

// Система PvP рейтинга, с использованием счёта.

// Для работы скрипта c SQL сервером, заугрузите в вашу бд следующий дамп:

// ALTER TABLE `char` ADD COLUMN `pvprat` int(11) NOT NULL DEFAULT '0' AFTER `fame`;

//===== Additional Comments: =================================

// v1.0b - Первый релиз.

// Счёт очков ведётся по фиксированным числам. [Empty]

// v1.0 - Исправлен баг с калькуляцией очков [Empty]

// v1.1 - В табилице не указываются чары с 0 PK поинтов [Empty]

// v1.1b - Исправлен баг с отниманием очков у убитого.

// Теперь очков не может быть меньше 0 [Empty]

// v1.2 - Исправлен баг с начислением "левых" поинтов [Empty]

// v1.3 - Изменены переменные.

// Все функции расставлены по порядку. [Empty]

// v1.4 - Отключены счётчики в замках.

// Добавлены аннонсы убийце и убитому. [Empty]

// v1.5 - Добавлены формулы подсчёта рейтинга. [Empty]

// v1.5b - Добавлено большее количество локаций-исключений.

// (спасибо Rumpl!) [Empty]

// v1.6 - При смерти если количиство отнимаемых очков больше,

// чем количиство имеющихся,

// значиние приравнивается к 0.

// (за идею спасиб I'm n00b XD) [Empty]

// v1.7 - За убийство самого себя не снимают и не прибавляют

// поинтов (За идею спасиб I'm n00b XD) [Empty]

// v1.7b - Исправлены ошибки с перенаправлением. [Empty]

// v2.0b - Заменена система исключений. Теперь проверка

// Идёт на убийство на PvP арене.

// В иных зонах не работает. [F4nT]

// v2.1 - Изменена структура рейтинга. Теперь работает через

// OnPCKillEvent. Оптимизирован код. Доска рейтинга

// Теперь расположена отдельно. [F4nT]

// v2.1a - Добавлена проверка на ГМ левел. За идею спасибо

// VoidLess. [F4nT]

//============================================================

- script OnPCKillEvent -1,{

OnPCKillEvent:

function Rating_Winner;

function Rating_Loser;

set @disable_gms, 1; // Проверка на Гм уровень. 1 - вкл. 0 - выкл.

set @servertype, 1; // 1 - Normal Server; 2 - PvP Server.

set @db_name$, "homero"; // Название базы данных, в которых расположена таблица рейтинга.

setarray @eventmaps$[0], "guild_vs2";

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

if ( getmapxy( @mapname$, @mapx, @mapy, 0, strcharinfo(0) ) != 0 ) end;

switch (@servertype) {

case 1:

for ( set @i, 0; @i <= getstrlen( @eventmaps$ ); set @i, @i+1 )

{

if ( @mapname$ == @eventmaps$[@i] )

{

set @eventgo, 1;

break;

}

}

break;

case 2:

set @eventgo, 1;

for ( set @i, 0; @i <= getstrlen( @eventmaps$ ); set @i, @i+1 )

{

if ( @mapname$ == @eventmaps$[@i] )

{

set @eventgo, 0;

break;

}

}

break;

}

if ( !@eventgo ) end;

if ( @disable_gms && getgmlevel() >= 40 ) end;

set $@PvP_Point, 80;

set PvP_Kills,PvP_Kills+1;

set $@KillerName$, strcharinfo(0);

set $@KilledName$, rid2name( killedrid );

set $@Kill_base, BaseLevel;

set @killer_sex, Sex;

set @PPkkanus, rand(1,21);

if ( @killer_sex ){

set $@kill_msg$, "убил";

} else {

set $@kill_msg$, "убила";

}

set @tmp_dead, killedrid;

attachrid( @tmp_dead );

set PvP_Death, PvP_Death+1;

set $@Dead_base, BaseLevel;

Rating_Winner;

Rating_Loser;

announce "[ "+$@KillerName$+" ] "+$@kill_msg$+" [ "+$@KilledName$+" ].",bc_map;

end;

function Rating_Winner {

if ( $@Kill_base < $@Dead_base )

set $@CountWinner, ( $@PvP_Point + ( $@Dead_base - $@Kill_base ) ) / 5;

else

set $@CountWinner, ( $@PvP_Point - ( $@Kill_base - $@Dead_base ) ) / 5;

if ( PvP_Kills > 1 ) {

query_sql "UPDATE "+@db_name$+".pvprate SET pvprat=pvprat+"+$@CountWinner+" WHERE name='"+$@KillerName$+"'";

} else {

query_sql "INSERT INTO "+@db_name$+".pvprate (`name`,`pvprat`) VALUES ('"+$@KillerName$+"',"+$@CountWinner+")";

}

return;

}

function Rating_Loser {

if ( !PvP_Kills ) return;

set @PvP_LosPoints, 0;

if ( PvP_Kills - PvP_Death >= 0 ) {

if ( $@Kill_base < $@Dead_base )

set $@CountLoser, ( $@PvP_Point + ( $@Dead_base - $@Kill_base ) ) / 5;

else

set $@CountLoser, ( $@PvP_Point - ( $@Kill_base - $@Dead_base ) ) / 5;

cleararray @pvp_loser[0],0,1;

query_sql "SELECT pvprat FROM "+@db_name$+".pvprate WHERE name='"+$@KilledName$+"'", @pvp_loser;

if ( $@CountLoser < @pvp_loser[0] )

set @PvP_LosPoints, @pvp_loser[0] - $@CountLoser;

}

query_sql "UPDATE "+@db_name$+".pvprate SET pvprat="+@PvP_LosPoints+" WHERE name='"+$@KilledName$+"'";

return;

}

}

prontera,164,172,3 script ПвП-Рейтинг 857,{

set @db_name$, "homero"; // Название базы данных, в которых расположена таблица рейтинга.

mes "[ PvP System ]";

mes "Я могу показать вам:";

mes "1. Лидеров-Убийц (Топ 100).";

mes "2. Ваш Статус.";

next;

switch(select("Лидеры-Убийцы","Мой Cтатус","Выход")) {

case 1:

set @topcount, 100;

cleararray @pvpboard1$[0],"",@topcount;

cleararray @pvpboard2[0],0,@topcount;

query_sql "SELECT name, pvprat FROM "+@db_name$+".pvprate ORDER BY pvprat DESC LIMIT "+@topcount+";", @pvpboard1$, @pvpboard2;

mes "[ ^ff0000Топ "+@topcount+"^000000 ]";

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

if(@pvpboard2[@i] != 0)

mes "["+(@i+1)+"] ^0000FF[ "+@pvpboard1$[@i]+" ]^000000 - ^FF0000"+@pvpboard2[@i]+"^000000.";

else

mes "["+(@i+1)+"] ^0000FF[ Пусто ]^000000 - ^FF0000"+@pvpboard2[@i]+"^000000.";

}

close2;

break;

case 2:

cleararray @pvp_points[0],0,1;

query_sql "SELECT pvprat FROM "+@db_name$+".pvprate WHERE name='"+strcharinfo(0)+"'", @pvp_points;

mes "[ PvP Статус ^0000ff"+strcharinfo(0)+"^000000 ]";

mes "Убийств: ^0000FF"+PvP_Kills+"^000000";

mes "Сметрей: ^0000FF"+PvP_Death+"^000000";

mes " ";

mes "PK рейтинг: ^0000FF"+@pvp_points[0]+"^000000";

close2;

break;

case 3:

close2;

break;

}

end;

}

Вот то что я загрузил в sql базу:

CREATE TABLE `pvprate` (

`id` int(11) NOT NULL auto_increment,

`name` varchar(30) NOT NULL default '',

`pvprat` int(11) NOT NULL DEFAULT '0',

PRIMARY KEY (`id`)

)

Почему пвп рейтинг 0 ?

9c3383c8633b.jpg

И вот что находится в phpmyadmin в таблице pvprate

89e1eafdba59.jpg

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

attachrid( @tmp_dead );

set PvP_Death, PvP_Death+1;
set $@Dead_base, BaseLevel;

Rating_Winner;
Rating_Loser;

announce "[ "+$@KillerName$+" ] "+$@kill_msg$+" [ "+$@KilledName$+" ].",bc_map;
end;

function Rating_Winner {
if ( $@Kill_base < $@Dead_base )
set $@CountWinner, ( $@PvP_Point + ( $@Dead_base - $@Kill_base ) ) / 5;
else
set $@CountWinner, ( $@PvP_Point - ( $@Kill_base - $@Dead_base ) ) / 5;

if ( PvP_Kills > 1 ) {
query_sql "UPDATE "+@db_name$+".pvprate SET pvprat=pvprat+"+$@CountWinner+" WHERE name='"+$@KillerName$+"'";
} else {
query_sql "INSERT INTO "+@db_name$+".pvprate (`name`,`pvprat`) VALUES ('"+$@KillerName$+"',"+$@CountWinner+")";
}
return;
}

Вот кривой кусок из-за которого дублируются записи в базе. Почему проверяются PvP_Kills у приаттаченного убитого? Надо у киллера проверять >_< Дальше, если честно, лень ковыряться. Прав был кто-то выше, проще с нуля самому написать, чем тут без намека на форматирование ковыряться =(

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

Помочь в чем? переписывать рейтинг от Empty? Спасибо, увольте (: Написать свой - пиши, в чем проблема? Вопросы будут - поможем. А просто так а-ля вынь-да-положь лично я не буду делать, разве что найдется что-то уже написанное и достаточно лишь выложить :)

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

Ладно , тогда по другому. Объясните мне принцип работы этого кода :

set $@CountLoser, ( $@PvP_Point + ( $@Dead_base - $@Kill_base ) ) / 5;

else

set $@CountLoser, ( $@PvP_Point - ( $@Kill_base - $@Dead_base ) ) / 5;

Я правильно понимаю , это переменная которая показывает как рейтинг высчитывается ?

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

Ладно , тогда по другому. Объясните мне принцип работы этого кода :

set $@CountLoser, ( $@PvP_Point + ( $@Dead_base - $@Kill_base ) ) / 5;

else

set $@CountLoser, ( $@PvP_Point - ( $@Kill_base - $@Dead_base ) ) / 5;

Я правильно понимаю , это переменная которая показывает как рейтинг высчитывается ?

Ну да) Это обсчет рейтинга. Сколько поинтов отнять у персонажа. $@CountLoser = ( 80 + ( Базовый лвл умершего - Базовый лвл киллера ) ) / 5. Сюда можешь свою формулу придумать :)

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

а почему 80 и /5 ?

p.s. кто подскажет как сделать, чтобы без пересчета рейтинга, просто выводилось сколько убийств и смертей. А рейтинг выставлялся по принципу у кого больше убийств тот круче. :D

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

а почему 80 и /5 ?

p.s. кто подскажет как сделать, чтобы без пересчета рейтинга, просто выводилось сколько убийств и смертей. А рейтинг выставлялся по принципу у кого больше убийств тот круче. :D

80 и /5 потому что автор скрипта так придумал :D


set $@CountLoser, ( $@PvP_Point + ( $@Dead_base - $@Kill_base ) ) / 5;
else
set $@CountLoser, ( $@PvP_Point - ( $@Kill_base - $@Dead_base ) ) / 5;

заменить на

set $@CountLoser, 1;
else
set $@CountLoser, 1;

и аналогично поступить с $@CountWinner.

или другой вариант:

query_sql "UPDATE "+@db_name$+".pvprate SET pvprat=pvprat+"+$@CountWinner+" WHERE name='"+$@KillerName$+"'";

заменить на

query_sql "UPDATE "+@db_name$+".pvprate SET pvprat=pvprat+1 WHERE name='"+$@KillerName$+"'";

и так же поменять в запросе для Winner'а.

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

Кеник, подскажи правильно я запрос изменил ?

CREATE TABLE `pvprate` (

`id` int(11) unsigned NOT NULL default '0',

`name` varchar(255) NOT NULL default '',

`pvpkill` int(11) unsigned NOT NULL default '0',

`pvpdie` int(11) unsigned NOT NULL default '0',

PRIMARY KEY (`id`)

)

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

Подскажи как переделать меню "Ваш Статус" :

cleararray @pvp_points[0],0,1;

query_sql "SELECT pvprate FROM "+@db_name$+".pvprate WHERE name='"+strcharinfo(0)+"'", @pvp_points;

mes "[ PvP Статус ^0000ff"+strcharinfo(0)+"^000000 ]";

mes "Убийств: ^0000FF"+PvP_Kills+"^000000";

mes "Сметрей: ^0000FF"+PvP_Death+"^000000";

close2;

break;

Я не понимаю как мне запрос переделать что бы ошибок не было.

Ошибка когда тыркаю на "Ваш Статус":


[SQL]: DB error - Unknown column 'pvprate' in 'field list'
[Debug]: at ..\src\map\script.c:12741 - SELECT pvprate FROM homero.pvprate WHERE
name='Artur'
[Debug]: Source (NPC): ╧т╧-╨хщЄшэу at prontera (164,172)

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

query_sql "SELECT pvprate FROM "+@db_name$+".pvprate WHERE name='"+strcharinfo(0)+"'", @pvp_points;

Красным выделил. Там нужно указывать имя колонки в таблице, из которой значение выбирать, а не имя таблицы. Поправь самостоятельно, так полезнее ;)

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

Таак... pvpkill сработало, теперь не понимаю другого, вот что у меня в базе в таблице pvprate:

6c9aa4916686.jpg

а вот что в игре показывает...

87ca7270a8f1.jpg

А вот теперь самое интересное , в игре показывает 1 убийство и 1 смерть, а в таблице даже на ник artuur ничего нету... Откуда он это взял ?О_О

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

В скрипте берутся переменные, а не данные из таблицы (кстати зачем в скрипте нпц запрос, если он не нужен?), из чего можно сделать вывод, что в таблицу ничего не записалось

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

Хммм... мне интересно, как сделать что бы из определённый таблицы высчитывалось и записывалось ? что бы в таблицу global_reg_value ничего не записывалось...

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

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