CreatePalatka
#1

Всем привет, создаю динамическую систему "палаток" , торговых лавок. Сама команда выглядит так
PHP код:
CMD:createpalatka(playeridparams[])
{
     if(
GetPVarInt(playerid"LOGIN") == 0) return SendClientMessage(playeridCOLOR_LIGHTRED,"Авторизуйтесь перед использованием команд!");
    if(
sscanf(params"ds[64]"params[0],params[1])) return send(playeridCOLOR_WHITE"Используйте /createpalatka [цена][название]");
    new 
Float:x,Float:y,Float:z;
    
GetPlayerPos(playeridx,y,z);
    new 
query[333];
    
totalp += 1totalid += 1;
    
format(querysizeof(query), "INSERT INTO `Rinok` (Name_p, Owner_p, x, y, z, radius, Price_p) VALUE ('%s', 'NONE', '%f', '%f', '%f', '%f', '%d')",params[1], xyz2.0params[0]);
    
mysql_tquery(dbHandlequery"""");
    
    
PalatkaInfo[totalp][ID_p] = totalid;
    
PalatkaInfo[totalp][Price_p] = params[0];
    
strmid(PalatkaInfo[totalp][Name_p], params[1], 0300);
    
strmid(PalatkaInfo[totalp][Owner_p],"NONE",300);
    
PalatkaInfo[totalp][x_p] = x;
    
PalatkaInfo[totalp][y_p] = y;
    
PalatkaInfo[totalp][z_p] = z;
    
PalatkaInfo[totalp][r_p] = 2.0;
    
    
    new 
string[64];
    
format(string,sizeof(string),"Палатка продается [ %d $ ]\n/buyp чтобы купить",PalatkaInfo[totalp][Price_p]);
    
PalatkaInfo[totalp][palatkai] = CreateDynamic3DTextLabel(stringCOLOR_LIGHTGREENPalatkaInfo[totalp][x_p], PalatkaInfo[totalp][y_p], PalatkaInfo[totalp][z_p], 10.0);
    
    
SendClientMessage(playeridCOLOR_WHITE"Палатка успешно создана");
    return 
true;

Если создать палатку и купить ее после рестарта, то все хорошо, значит сохранение и загрузка работают нормально. А я хочу сделать чтобы как только создал ее, так можно было и купить.
totalp это переменная для подсчета количества палаток, totalid это переменная для того, чтобы узнать последний ид палатки ну и прибавит к нему 1, это происходит в паблике загрузки. Так вот, что я делаю не правильно? подскажите пожалуйста.
Reply
#2

ID_p - это идентификатор которые ты создаешь или из базы данных?

И проблема то в чем, в том что её нельзя купить, тогда не хватает кода покупки?!
Reply
#3

ID_p это из бд автоинкремент. Код покупки есть тоже
PHP код:
CMD:buyp(playerid)
{
    if(
GetPVarInt(playerid"LOGIN") == 0) return SendClientMessage(playeridCOLOR_LIGHTRED,"Авторизуйтесь перед использованием команд!");
    for(new 
idx;idx!=totalp+1;idx++)
    {
        if(
IsPlayerInRangeOfPoint(playeridPalatkaInfo[idx][r_p], PalatkaInfo[idx][x_p],PalatkaInfo[idx][y_p],PalatkaInfo[idx][z_p]))
        {
        if(
strcmp(PalatkaInfo[idx][Owner_p], "NONE"true)) return send(playeridCOLOR_LIGHTRED"Эта торговая лавка не продается");
        if(
Player[playerid][Palatkaid] > 0) return send(playeridCOLOR_LIGHTRED"У вас уже есть палатка!");
        if(
Player[playerid][Money] < PalatkaInfo[idx][Price_p]) return send(playeridCOLOR_LIGHTRED"У вас не хватает денег для покупки!");
        
GiveMoney(playerid, -PalatkaInfo[idx][Price_p]);
        
SendClientMessage(playerid, -1"Вы приобрели {66cc33}торговую лавку");
        
SendClientMessage(playeridCOLOR_WHITE"Меню управления лавкой {66cc33}/menup");
        
Player[playerid][Palatkaid] = PalatkaInfo[idx][ID_p];
        
strmid(PalatkaInfo[idx][Owner_p], UserName(playerid), 064300);
        
DestroyDynamic3DTextLabel(PalatkaInfo[idx][palatkai]);
        new 
string[128];
        
format(string,sizeof(string),"{ca670c}Торговая лавка:{ffffff} %s [ID: %d]\n{ca670c}Владелец: {ffffff}%s",PalatkaInfo[idx][Name_p],PalatkaInfo[idx][ID_p] ,PalatkaInfo[idx][Owner_p]);
        
PalatkaInfo[idx][palatkai] = CreateDynamic3DTextLabel(string, -1PalatkaInfo[idx][x_p], PalatkaInfo[idx][y_p], PalatkaInfo[idx][z_p],10.0);
        break;
        }
        else
        {
        
printf("Рядом нет палаток");
        }
    }
    return 
true;

Reply
#4

Ну так и получай его из базы функцией возвращающей последний вставленный ID, а так у тебя возможна ошибка. Например буквально пару месяцев назад я столкнулся с базой у которой автоинкримент прибавлял не по 1, а по 2 и все ключи в базе были четные!

Зачем такие сложности: idx!=totalp+1, по-моему это очевидно: idx <= totalp.
В функции покупки стоит добавить проверку на существует ли палатка вообще и сперва проверять её на занятость, а уж потом на то где она. То же самое касается наличия денег и наличие у вас палатки, второе так вообще нужно вынести за пределы цикла!

Ну и до фига месть с выходом за пределы массива!
Reply
#5

Можешь пожалуйста сказать функцию , которая возвращает последний вставленный ID?
Reply
#6

cache_insert_id

Обрати внимание на пример, использовать её надо в колбеке!
Reply
#7

Благодарю.
Reply
#8

Вообщем, я сделал вроде как ты сказал, но все равно не получается.
PHP код:
CMD:buyp(playerid)
{
    if(
GetPVarInt(playerid"LOGIN") == 0) return SendClientMessage(playeridCOLOR_LIGHTRED,"Авторизуйтесь перед использованием команд!");
    if(
Player[playerid][Palatkaid] > 0) return send(playeridCOLOR_LIGHTRED"У вас уже есть палатка!");
    for(new 
idx;idx<=totalp;idx++)
    {
        if(
IsPlayerInRangeOfPoint(playeridPalatkaInfo[idx][r_p], PalatkaInfo[idx][x_p],PalatkaInfo[idx][y_p],PalatkaInfo[idx][z_p]))
        {
        if(
strcmp(PalatkaInfo[idx][Owner_p], "NONE"true)) return send(playeridCOLOR_LIGHTRED"Эта торговая лавка не продается");
        if(
Player[playerid][Money] < PalatkaInfo[idx][Price_p]) return send(playeridCOLOR_LIGHTRED"У вас не хватает денег для покупки!");
        
GiveMoney(playerid, -PalatkaInfo[idx][Price_p]);
        
SendClientMessage(playerid, -1"Вы приобрели {66cc33}торговую лавку");
        
SendClientMessage(playeridCOLOR_WHITE"Меню управления лавкой {66cc33}/menup");
        
Player[playerid][Palatkaid] = PalatkaInfo[idx][ID_p];
        
strmid(PalatkaInfo[idx][Owner_p], UserName(playerid), 064300);
        
DestroyDynamic3DTextLabel(PalatkaInfo[idx][palatkai]);
        new 
string[128];
        
format(string,sizeof(string),"{ca670c}Торговая лавка:{ffffff} %s [ID: %d]\n{ca670c}Владелец: {ffffff}%s",PalatkaInfo[idx][Name_p],PalatkaInfo[idx][ID_p] ,PalatkaInfo[idx][Owner_p]);
        
PalatkaInfo[idx][palatkai] = CreateDynamic3DTextLabel(string, -1PalatkaInfo[idx][x_p], PalatkaInfo[idx][y_p], PalatkaInfo[idx][z_p],10.0);
        break;
        }
    }
    return 
true;

Так же приравнял totalid = cache_insert_id(dbHandle); в паблике загрузки палаток.
Reply
#9

Quote:
Originally Posted by AlexeyTrekkkk
Посмотреть сообщение
Так же приравнял totalid = cache_insert_id(dbHandle); в паблике загрузки палаток.
Reply
#10

ты же сам говорил
Quote:

Ну так и получай его из базы функцией возвращающей последний вставленный ID, а так у тебя возможна ошибка. Например буквально пару месяцев назад я столкнулся с базой у которой автоинкримент прибавлял не по 1, а по 2 и все ключи в базе были четные!

Reply
#11

А где ты видишь фразу "при загрузке", вроде четко написано "вставленный ID", или ты каждый раз удаляешь и создаешь записи?!
Reply
#12

все, вопрос решен, я забыл в запросе кавычки поставить при сохранении. ох лол
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)