Подскажите теорию,можно конечно и пример с объяснением,в общем хочу сделать топ игроков,допустим по количеству очков(скор),но вот пока так и не могу понять как это сделать :с
Вид для печати
Подскажите теорию,можно конечно и пример с объяснением,в общем хочу сделать топ игроков,допустим по количеству очков(скор),но вот пока так и не могу понять как это сделать :с
Ну, цикл игроков на сервере, отсеивание игроков у которых лвл например меньше 3, остальных выводи в чат или например в диалог.
Ну вот пример. Должно работать, по идее :)
UPD: Немного подредактировал. Не учёл то, что если первым в списке игроков будет игрок с большим количеством Score, его запишет во все переменные :D Если не будет работать, опиши подробно как и что работает не так. ИсправимPHP код:
Удалено. Смотреть ответы ниже
А таблица будет обновляться на 1 игрока?
http://ihost.pro-pawn.ru/image.php?dt=R7UZ
Нашёл ошибку. Вот подправленный вариант
PHP код:
stock Top10(playerid)
{
new TopPlayers[2][10];
for(new i; i < 10; i++) TopPlayers[1][i] = INVALID_PLAYER_ID;
for(new i, a, score, o, slots = GetMaxPlayers(); i < slots; i++)
{
if(!IsPlayerConnected(i) || (score = GetPlayerScore(i)) < TopPlayers[0][a]) continue;
for(new j; j < 10; j++)
{
if(TopPlayers[1][j] == TopPlayers[1][a] && TopPlayers[1][a] != INVALID_PLAYER_ID)
{
o = 1;
break;
}
else if(TopPlayers[1][j] == TopPlayers[1][a] && TopPlayers[1][a] == INVALID_PLAYER_ID) break;
}
if(o == 1)
{
o = 0;
continue;
}
else
{
TopPlayers[0][a] = score;
TopPlayers[1][a] = i;
a++;
}
}
new string[(53+24+2+3+11)*10], PlayerName[MAX_PLAYER_NAME];
for(new i; i < 10; i++)
{
if(TopPlayers[1][i] == INVALID_PLAYER_ID) format(string, sizeof(string), "%s{c0c0c0}%d место: {FFFFFF}Не обнаружено\n\n", string, i+1);
else
{
GetPlayerName(TopPlayers[1][i], PlayerName, MAX_PLAYER_NAME);
format(string, sizeof(string), "%s{c0c0c0}%d место: {FFFFFF}%s [ID: %d]. Score = %d\n\n", string, i+1, PlayerName, TopPlayers[1][i], TopPlayers[0][i]);
}
}
return ShowPlayerDialog(playerid, 6666, DIALOG_STYLE_MSGBOX, "Топ 10", string, "Закрыть", "");
}
а разница? GetPlayerScore(i) -это вроде функция узнающая score игрока,во время гонки все дрифт очки идут в score игрока,так что без разницы указать переменную или функцию,ну и все ровно и так и так у меня пустой список,а суть предыдущего вопроса в том что если я буду один(без других игроков) в список я должен буду выйти или обязательно что-бы кто-то еще был?
Эм ну у меня как-то так:
При "дрифте"
узнаем очки игрока(score)-записываем в переменную
очки набранные во время дрифта - запишем в переменную
1 переменную сложем со 2 переменной (1+2) - все это в переменную 3
выдадим очки игроку функцией SetPlayerScore кол-во очков берем из 3 переменной
как-то так
Дабы не создавать флуд темами напишу тут-же еще вопросик,
в подробности не будем ударяться а суть в том что надо сделать функцию "CreatePickup"
но что-бы данные в нее писались из БД(SQL(не MySQL)) и я вот не знаю с чего начать :read:
Начать стоит с массива или Enum, в котором будут все нужные переменные, куда будем грузить данные.
Далее составляешь обычный запрос подобный тому, что ты делаешь при загрузке аккаунта, только уже без всяких лимитов (то бишь всю таблицу грузишь). Ну и тальше построчно грузишь данные в переменные и тут же создаёшь пикап. То бишь
PHP код:
stock LoadPicups()
{
//Создаём запрос
//Узнаём число строк в таблице
//Обрабатываем данные, если это требует pawn (не работал с Sql)
while(Выполняем цикл столько раз, сколько строк в БД)
{
//sscanf'oм или каким-либо другим обработчиком грузим из столбцов данные в переменные
CreatePicup(/*Наши переменные с информацией о пикапах*/);
}
возврат 1;
}
Дабы обработать построчно таблицу. Перед циклом ты посылаешь запрос, как бы открывая файл, а дальше начинаешь обрабатывать всю таблицу, строку за строкой. Можно попробовать так
Только вряд ли будет работать. Накидал код исходя из информации в интернетеPHP код:
new DB:userdb, DBResult:result;
userdb = db_open("имя_бд.db");
result = db_query(userdb, "SELECT * FROM `имя_таблицы`");
while(db_next_row(result))
{
db_get_field_assoc(result, "Имя_поля", Переменная_для_записи_1, размер_переменной);
db_get_field_assoc(result, "Имя_поля", Переменная_для_записи_2, размер_переменной);
db_get_field_assoc(result, "Имя_поля", Переменная_для_записи_3, размер_переменной);
db_get_field_assoc(result, "Имя_поля", Переменная_для_записи_4, размер_переменной);
CreatePickup(Переменная_для_записи_1,Переменная_для_записи_2,Переменная_для_записи_3,Переменная_для_записи_4);
}
db_free_result(result);
db_close(userdb);
небудет работать - разЦитата:
while(db_next_row(result))
{
db_get_field_assoc(result, "Имя_поля", Переменная_для_записи_1, размер_переменной);
db_get_field_assoc(result, "Имя_поля", Переменная_для_записи_2, размер_переменной);
db_get_field_assoc(result, "Имя_поля", Переменная_для_записи_3, размер_переменной);
db_get_field_assoc(result, "Имя_поля", Переменная_для_записи_4, размер_переменной);
CreatePickup(Переменная_для_записи_1,Переменная_для_записи_2,Переменная_для_записи_3,Переменная_для_записи_4);
}
зачем так много переменных для записи - 2
еще сам полазил по вики,вроде что-то начинаю понимать,но вот что интересно "размер_переменной" - как его узнать?
Под них нужен не массив, а переменная вещественного типа (Float)
Ну в таблице делаешь столбец форматом Float. Потом в enum создаёшь что-то типа
И в запросе что-то типаPHP код:
Float:PosX,
Float:PosY,
Float:PosZ,
И вообще вики для кого? :)PHP код:
new data[15];
db_get_field_assoc(result, "Имя_поля", data, sizeof(data));
NameVarchar[ячейка][PosX] = floatstr(data);
db_get_field_assoc(result, "Имя_поля", data, sizeof(data));
NameVarchar[ячейка][PosY] = floatstr(data);
db_get_field_assoc(result, "Имя_поля", data, sizeof(data));
NameVarchar[ячейка][PosZ] = floatstr(data);
http://wiki.sa-mp.com/wiki/Db_get_field_RU
С горем пополам вроде разобрался,счас проверим на работоспособность
В общем парился-парился но своего добился:
number 2PHP код:
#include <a_samp>
new model,type,Float:X,Float:Y,Float:Z,world,rPikap;
public OnFilterScriptInit()
{
LoadPicups();
return 1;
}
stock LoadPicups()
{
new DB:db = db_open("Race.db");
new DBResult:dbresult;
new query[100],irace[20];
format(query,sizeof(query),"SELECT * FROM `rinfo`");
dbresult = db_query(db,query);
db_get_field(dbresult, 0, irace, sizeof(irace));
model = strval(irace);
db_get_field(dbresult, 1, irace, sizeof(irace));
type = strval(irace);
db_get_field(dbresult, 2, irace, sizeof(irace));
X = floatstr(irace);
db_get_field(dbresult, 3, irace, sizeof(irace));
Y = floatstr(irace);
db_get_field(dbresult, 4, irace, sizeof(irace));
Z = floatstr(irace);
db_get_field(dbresult, 5, irace, sizeof(irace));
world = strval(irace);
rPikap = CreatePickup(model,type,X,Y,Z,world);
printf("пикап создан:\nмодель:%d\nтип:%d\nкоордината Х:%f\nкоордината Y:%f\nкоордината Z:%f\nНомер виртуального мира:%d",model,type,X,Y,Z,world);
db_free_result(dbresult);
return 1;
}
public OnPlayerPickUpPickup( playerid, pickupid )
{
if(pickupid == rPikap)SetPlayerPos(playerid, 2308.0684,1520.6025,10.5474);
return 1;
}
PHP код:
#include <a_samp>
enum irace
{
model,
type,
Float:X,
Float:Y,
Float:Z,
world,
rPikap
};
new iRace[MAX_PLAYERS][irace];
public OnPlayerConnect(playerid)
{
LoadPicups(playerid);
return 1;
}
stock LoadPicups(playerid)
{
new DB:db = db_open("Race.db");
new DBResult:dbresult;
new query[100],race[20];
format(query,sizeof(query),"SELECT * FROM `rinfo`");
dbresult = db_query(db,query);
db_get_field(dbresult, 0, race, sizeof(race));
iRace[playerid][model] = strval(race);
db_get_field(dbresult, 1, race, sizeof(race));
iRace[playerid][type] = strval(race);
db_get_field(dbresult, 2, race, sizeof(race));
iRace[playerid][X] = floatstr(race);
db_get_field(dbresult, 3, race, sizeof(race));
iRace[playerid][Y] = floatstr(race);
db_get_field(dbresult, 4, race, sizeof(race));
iRace[playerid][Z] = floatstr(race);
db_get_field(dbresult, 5, race, sizeof(race));
iRace[playerid][world] = strval(race);
iRace[playerid][rPikap] = CreatePickup(iRace[playerid][model],iRace[playerid][type],iRace[playerid][X],iRace[playerid][Y],iRace[playerid][Z],iRace[playerid][world]);
printf("пикап создан:\nмодель:%d\nтип:%d\nкоордината Х:%f\nкоордината Y:%f\nкоордината Z:%f\nНомер виртуального мира:%d",iRace[playerid][model],iRace[playerid][type],iRace[playerid][X],iRace[playerid][Y],iRace[playerid][Z],iRace[playerid][world]);
db_free_result(dbresult);
return 1;
}
public OnPlayerPickUpPickup( playerid, pickupid )
{
if(pickupid == iRace[playerid][rPikap])SetPlayerPos(playerid, 2308.0684,1520.6025,10.5474);
return 1;
}
Может кому-то понадобиться,а может кто-нибудь найдет ошибки и т.п..Код HTML:CREATE TABLE rinfo (model INTEGER, type INTEGER, X DOUBLE, Y DOUBLE, Z DOUBLE, world INTEGER)
Эмм,как не странно,я опять нуждаюсь в помощи :с
То что сделал выше считывает данные с 1 строки,а если будет 2,3,5,10 и т.д. то как считывать определенную строку которую мне надо?
Создай идентификатор для каждой строки (создай строку, обзови её чем-то типа "ID" и установи ей значение auto_increment) и по нему уже ищи нужную тебе строку.
И да, если ты собираешься подобным образом грузить пикапы, для каждого отдельного пикапа придётся создавать свой stock =) Циклом грузи
И смысл тут в playerid? О_о
PHP код:
iRace[playerid][Z]
правильно, ты и запрашиваешь первую строку.Цитата:
То что сделал выше считывает данные с 1 строки,а если будет 2,3,5,10 и т.д. то как считывать определенную строку которую мне надо?
да,до меня хреного доходит,согласен :to_take_umbrage:
но вот объясни мне как с помощью цикла я вызову из БД 2 строку а не 1?
как я помню цикл повторяет итерацию пока условие не станет ложным,дак если он повторяет,то цикл мне будет повторять ну а точнее в данном случаи выводить 1 строку из БД определенное кол-во раз,ну или я не совсем что-то понял :с
db_num_rows на пару с циклом тебе помогут, в конце концов, залезь в мои темы и поизучай систему домов или машин.
посмотрел пример,как я понял то при загрузке стока с пикапами считает данные со всей таблице и создаст столько пикапов сколько есть в таблице,т.е. это делает полный вывод таблицы,но мне надо не всю таблицу а определенную строку1,3 или 10-тую,но не все разом,или я опять не так понял :pardon:
- - - Добавлено - - -
И почему я не удивлен от этого ответа, мне вот ДеимоС вполне тоже-самое сказал,но проблема знаешь в чем? В том что я понять не могу как это будет работать,указывать на функции бесполезно,и на вики тоже не надо,я уже все перечитал,я понять не могу.. :с
По поводу выгрузки определённой строки я тоже уже сказал. Создаёшь в таблице столбец-идентификатор, по которому уже и делай запрос. Точно так же, как и с загрузкой аккаунта
Это подойдёт если тебе во время игры нужно грузить определённый пикап в определённое место. Если же все пикапы нужно создавать (при старте мода, например), делай циклом, а не подобным образом.PHP код:
format(query,sizeof(query),"SELECT * FROM `rinfo` WHERE `Столбец_Идентификатор` = '%d'",переменная_хранящая_нужное_значение);
И для кого я давал эту ссылку?
http://wiki.sa-mp.com/wiki/Db_get_field_RU
В параметрах чётко указано какой параметр определяет строку, которая будет обрабатываться.
Ты не поймёшь как это работает, пока не попробуешь. Кто мешает поэкспериментировать с параметрами? Тебя что ли бьют каждый раз, когда ты пишешь неработоспособный код? :) Давно бы уже вставил в мод, да пошаманил с кодом, посмотрев как мод будет реагировать на тот или иной вариант. Это тебе уже даст опыт, ибо ты, опробовав все удачные и неудачные варианты, обретёшь гораздо больше знаний, нежели мы тебе будем сейчас тут всё разжёвывать :)
Так, стоп. Ты хочешь грузить гонку игрока из БД? Или как?
Вообще какая цель у тебя? Подробнее объясни, а то может я тебе совсем не то рассказываю :)
P.S. Только сейчас глянул на имя Enum и появился вот такой вопрос :)
- - - Добавлено - - -
А если ещё и напишешь о том, что сохранять собираешься (какие данные в БД будут храниться), попробую тоже что-нибудь накодить :blush: