ПуфЫстик

Пвп рейтинг

19 сообщений в этой теме

Всем привет, нашёл в интернете старый пвп рейтинг 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 ( [email protected] ) end;

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

set [email protected]_Point, 80;

set PvP_Kills,PvP_Kills+1;

set [email protected]$, strcharinfo(0);

set [email protected]$, rid2name( killedrid );

set [email protected]_base, BaseLevel;

set @killer_sex, Sex;

set @PPkkanus, rand(1,21);

if ( @killer_sex ){

set [email protected]_msg$, "убил";

} else {

set [email protected]_msg$, "убила";

}

set @tmp_dead, killedrid;

attachrid( @tmp_dead );

set PvP_Death, PvP_Death+1;

set [email protected]_base, BaseLevel;

Rating_Winner;

Rating_Loser;

announce "[ "[email protected]$+" ] "[email protected]_msg$+" [ "[email protected]$+" ].",bc_map;

end;

function Rating_Winner {

if ( [email protected]_base < [email protected]_base )

set [email protected]Winner, ( [email protected]_Point + ( [email protected]_base - [email protected]_base ) ) / 5;

else

set [email protected], ( [email protected]_Point - ( [email protected]_base - [email protected]_base ) ) / 5;

if ( PvP_Kills > 1 ) {

query_sql "UPDATE "[email protected]_name$+".pvprate SET pvprat=pvprat+"[email protected]+" WHERE name='"[email protected]$+"'";

} else {

query_sql "INSERT INTO "[email protected]_name$+".pvprate (`name`,`pvprat`) VALUES ('"[email protected]$+"',"[email protected]+")";

}

return;

}

function Rating_Loser {

if ( !PvP_Kills ) return;

set @PvP_LosPoints, 0;

if ( PvP_Kills - PvP_Death >= 0 ) {

if ( [email protected]_base < [email protected]_base )

set [email protected], ( [email protected]_Point + ( [email protected]_base - [email protected]_base ) ) / 5;

else

set [email protected], ( [email protected]_Point - ( [email protected]_base - [email protected]_base ) ) / 5;

cleararray @pvp_loser[0],0,1;

query_sql "SELECT pvprat FROM "[email protected]_name$+".pvprate WHERE name='"[email protected]$+"'", @pvp_loser;

if ( [email protected] < @pvp_loser[0] )

set @PvP_LosPoints, @pvp_loser[0] - [email protected];

}

query_sql "UPDATE "[email protected]_name$+".pvprate SET pvprat="[email protected]_LosPoints+" WHERE name='"[email protected]$+"'";

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 "[email protected]_name$+".pvprate ORDER BY pvprat DESC LIMIT "[email protected]+";", @pvpboard1$, @pvpboard2;

mes "[ ^ff0000Топ "[email protected]+"^000000 ]";

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

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

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

else

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

}

close2;

break;

case 2:

cleararray @pvp_points[0],0,1;

query_sql "SELECT pvprat FROM "[email protected]_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"[email protected]_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

Изменено пользователем ПуфЫстик
0

Поделиться сообщением


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

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

0

Поделиться сообщением


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

а почему нет ?

рейтинг он считает(сколько убил, сколько смертей) + если кто кого убивает он анонсит...

0

Поделиться сообщением


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

attachrid( @tmp_dead );

set PvP_Death, PvP_Death+1;
set [email protected]_base, BaseLevel;

Rating_Winner;
Rating_Loser;

announce "[ "[email protected]$+" ] "[email protected]_msg$+" [ "[email protected]$+" ].",bc_map;
end;

function Rating_Winner {
if ( [email protected]_base < [email protected]_base )
set [email protected], ( [email protected]_Point + ( [email protected]_base - [email protected]_base ) ) / 5;
else
set [email protected], ( [email protected]_Point - ( [email protected]_base - [email protected]_base ) ) / 5;

if ( PvP_Kills > 1 ) {
query_sql "UPDATE "[email protected]_name$+".pvprate SET pvprat=pvprat+"[email protected]+" WHERE name='"[email protected]$+"'";
} else {
query_sql "INSERT INTO "[email protected]_name$+".pvprate (`name`,`pvprat`) VALUES ('"[email protected]$+"',"[email protected]+")";
}
return;
}

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

0

Поделиться сообщением


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

И что никто не может помочь ? :unsure:

0

Поделиться сообщением


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

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

0

Поделиться сообщением


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

Я свой писал =( Терпеть ненавижу разгребать чужой код :D

1

Поделиться сообщением


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

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

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

0

Поделиться сообщением


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

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

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

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

0

Поделиться сообщением


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

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

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

Изменено пользователем ПуфЫстик
0

Поделиться сообщением


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

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

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

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


set [email protected], ( [email protected]_Point + ( [email protected]_base - [email protected]_base ) ) / 5;
else
set [email protected], ( [email protected]_Point - ( [email protected]_base - [email protected]_base ) ) / 5;

заменить на

set [email protected], 1;
else
set [email protected], 1;

и аналогично поступить с [email protected]

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

query_sql "UPDATE "[email protected]_name$+".pvprate SET pvprat=pvprat+"[email protected]+" WHERE name='"[email protected]$+"'";

заменить на

query_sql "UPDATE "[email protected]_name$+".pvprate SET pvprat=pvprat+1 WHERE name='"[email protected]$+"'";

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

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`)

)

0

Поделиться сообщением


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

Да. Скрипт под таблицу изменить не забудь :)

1

Поделиться сообщением


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

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

cleararray @pvp_points[0],0,1;

query_sql "SELECT pvprate FROM "[email protected]_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)

Изменено пользователем ПуфЫстик
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
query_sql "SELECT pvprate FROM "[email protected]_name$+".pvprate WHERE name='"+strcharinfo(0)+"'", @pvp_points;

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

1

Поделиться сообщением


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

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

6c9aa4916686.jpg

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

87ca7270a8f1.jpg

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

Изменено пользователем ПуфЫстик
0

Поделиться сообщением


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

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

Изменено пользователем Jarek
1

Поделиться сообщением


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

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

Изменено пользователем ПуфЫстик
0

Поделиться сообщением


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

Тему можно закрыть , я разобрался (помогли) .

0

Поделиться сообщением


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

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас