• 0
Sign in to follow this  
Followers 0
Mason

GetPlayerHouse/Bizz

Question

Всем Привет! Столкнулся я с такой проблемой, на аккаунте числится что есть дом/бизнес/заправка но на самом деле нет. Соответственно при выборе спавна предлагает вариант "в доме", купить дом, бизнес, и прочую фигню нельзя т.к пишет что уже есть дом..
Прилагаю код проверки на наличие того или иного имущества у игрока

Спойлер

stock GetPlayerHouse(playerid)//Это дома(впрочем такая же проверка стоит у бизнесов/заправок и.т.д)
{
    new house = 0;
    for(new i = 0; i <= HouseCount; i++)
    {
        if(!strcmp(HouseInfo[i][hOwner],PlayerInfo[playerid][pSendername],true)) house++, SetPVarInt(playerid, "PlayerHouse", i);
    }
    return house;
}

 


Произошло это всё после того как я на шаманил с i = 0, до этого вместо 0 стояла 1 почти везде(загрузка, взаимодействие с пикапом и так далее.) но т.к из за единицы не прогружалось имущество с 1 ид, было принято решение поставить 0.

Share this post


Link to post

35 answers to this question

  • 0

@Mason, вы мне что скинули, то я и анализирую, на основе чего формирую мысли. 

Share this post


Link to post
  • 0

@Cawfee, А ой извините, забыл приложить код проверки на наличие дома у игрока, простите, мой косяк..¬¬

 

Спойлер

stock GetPlayerHouse(playerid)
{
    new house = 0;
    for(new i = 0; i <= HouseCount; i++)
    {
        if(!strcmp(HouseInfo[i][hOwner],PlayerInfo[playerid][pSendername],true)) house++, SetPVarInt(playerid, "PlayerHouse", i);
    }
    return house;
}

 

 

Share this post


Link to post
  • 0

@Mason Проверь, с какого числа должен начинаться цикл в проверке имущества. Убедись, что это действительно должно быть 0, а не 1.

Добавь в код вывод отладочных сообщений, чтобы видеть, какое имущество присваивается игроку. Это поможет понять, где ошибка.

Исправь цикл в функции, чтобы он проверял все дома до последнего. Сделай так, чтобы цикл заканчивался на "меньше чем количество домов" (i < HouseCount).

Убедись, что в других частях кода, где проверяется наличие имущества, тоже используются правильные индексы.

Share this post


Link to post
  • 0

@D2DChat, Сделал ваш способ с циклом, помогло. Но теперь творится такая дичь, когда я покупаю дом допустим с 365 ид вроде всё нормально всё отлично, а вот после рестарта сервера оказывается что владею я домом с 364 ид.:(

Share this post


Link to post
  • 0

@Mason Это может происходить из-за неправильного сохранения или загрузки данных. Проверь, как ты сохраняешь данные о домах. Убедись, что ID дома сохраняется правильно и не смещается на 1. Проверь, как ты загружаешь данные о домах после рестарта сервера. Убедись, что данные загружаются с правильными ID.

 

Добавь отладочные сообщения в функции сохранения и загрузки данных, чтобы увидеть, что именно сохраняется и загружается.

Например, если у тебя есть функция, которая сохраняет данные о домах, добавь туда что-то вроде:

 

 

printf("Saving house data: ID = %d, Owner = %s", houseID, ownerName);

 

А в функции загрузки данных:

 

printf("Loading house data: ID = %d, Owner = %s", houseID, ownerName);

Так ты сможешь увидеть, где происходит смещение. Также проверь, нет ли в логике кода ошибок, которые могут приводить к смещению ID дома. Например, где-то может использоваться i-1 вместо i.

 

Попробуй эти шаги и посмотри, поможет ли это выявить и исправить ошибку. Если что-то будет неясно или понадобится помощь с конкретным кодом, дай знать!

Edited by D2DChat

Share this post


Link to post
  • 0

@D2DChat, Функции сохранения домов у меня нет, но я выявил вот такой прикол, покупаю 381 дом, в игре покупается 381 дом, а в базе присвоение владельца и прочая шняга идёт 380 дому..

Share this post


Link to post
  • 0

Попробуй проверить код, который отвечает за присвоение владельца дому. Убедись, что нигде не происходит смещение индекса на 1. Например, проверь, что ты не используешь i-1 вместо i.

 

Так же добавь отладочные сообщения в те места, где присваиваются владельцы домам, чтобы увидеть, где именно происходит смещение. Например, если у тебя есть функция, которая присваивает владельца дому, добавь туда что-то вроде:

 

printf("Setting owner for house ID %d to %s", houseid, PlayerInfo[playerid][pSendername]);

 

А когда ты сохраняешь данные в базу, добавь сообщение вроде:

 

printf("Saving house ID %d with owner %s to database", houseid, HouseInfo[houseid][hOwner]);

Так ты сможешь увидеть, где именно происходит смещение. Проверь все функции, которые работают с массивами домов, чтобы убедиться, что нигде нет ошибок с индексами.

Share this post


Link to post
  • 0

@D2DChat, и так я вставил принтфки куда надо, но что в привоении владельца что в записи в базу указывает 364 ид(покупаю я соответственно 365), ну... А посмотрев код я не увидел никаких странностей

Share this post


Link to post
  • 0

@Mason попробуй это, в стоке/паблике загрузки тоже измени на i = 1, если там 0

stock GetPlayerHouse(playerid)
{
    new house = 1;
    for(new i = 1; i <= HouseCount; i++)
    {
        if(!strcmp(HouseInfo[i][hOwner],PlayerInfo[playerid][pSendername],true)) house++, SetPVarInt(playerid, "PlayerHouse", i);
    }
    return house;
}

 

Share this post


Link to post
  • 0

@ddrgtagfon, увы но не помогло, если в загрузке домов поставить вместо 0 1 то дом с 0 ид пропадёт. А если поставить это в buyhouse но не менять в load house то это не даст никакого эффекта.

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • vernettoalex
      By vernettoalex
      Приветствую, у меня возникла проблема, мне для работы с диалогом который будет выводить информацию о тексте написанным в окне в базу данных нужен inputext, когда я его вписал рядом с ShowPlayerDialog, у меня не появляется диалог и не идёт процесс, но если я его уберу, то функция станет бесполезной. Помогите пожалуйста
       
      p.s - if(sscanf(inputtext, "s[90]", surname)) return SPD
       
       

    • Артём Профиков
      By Артём Профиков
      При входе в лаунчер информация о сервере не отображается, зайти нельзя. В панели нагрузки нет
      Логи:
      Server.cfg:
       
    • Iskon
      By Iskon
      const ID_AUTH_KEY = 12; OInternalPacket:ID_AUTH_KEY(playerid, BitStream:bs) {     new auth_key[512];     BS_IgnoreBits(bs, 8); // packetid     BS_ReadValue(bs, PR_STRING8, auth_key, sizeof(auth_key));     printf("incoming auth_key %s", auth_key);     new BitStream:newBs = BS_New();     BS_WriteValue(newBs,      PR_UINT8, 12, PR_STRING8, "2DC8A9B16332F78", 15);     PR_SendPacket(newBs, playerid, PR_SYSTEM_PRIORITY, PR_RELIABLE_SEQUENCED);     BS_Delete(newBs);     return 0; } По идее, этот код должен не отправить оригинальный idauthkey клиенту, а подменять значение idauthkey'a на "2DC8A9B16332F78", но пакет не отправляется клиенту. Как будто функция PR_SendPacket не срабатывает, и клиент ждет ответа от сервера. Как заставить отправить пакет?