Вход

Просмотр полной версии : [Вопрос] Намудрил с Актерами



Сергей
04.04.2021, 01:24
Доброго времени суток, что-то запутался, и разобраться не могу, намудрил что-то...
Вообщем, решил я значит актеров перенести в БД, ну сделал всё чётко, а потом начались проблемы с их идами...
Я хочу обращаться к ним по ID, я так понимаю, что они создаются изначально не с номера 0, сразу первый созданный это 1
и пошло на повышение, и из-за этого у меня путаница в голове и коде...



forward LoadActorCallBack();
public LoadActorCallBack()
{
new rows, fields;
new time = GetTickCount();
new count = 0;
cache_get_data(rows, fields,MysqlConnect);
if(rows == 0) return 1;
for(new i = 0; i < rows; i++)
{
ped_Actor[i][id_Actor] = cache_get_field_content_int(i,"id_actor", MysqlConnect);
ped_Actor[i][ped_Skin] = cache_get_field_content_int(i,"ped_skin", MysqlConnect);
cache_get_field_content(i,"ped_names",ped_Actor[i][ped_Names], MysqlConnect, 40);
ped_Actor[i][ped_Pos][0] = cache_get_field_content_float(i,"ped_pos_x", MysqlConnect);
ped_Actor[i][ped_Pos][1] = cache_get_field_content_float(i,"ped_pos_y", MysqlConnect);
ped_Actor[i][ped_Pos][2] = cache_get_field_content_float(i,"ped_pos_z", MysqlConnect);
ped_Actor[i][ped_Pos][3] = cache_get_field_content_float(i,"ped_pos_a", MysqlConnect);
ped_Actor[i][ped_World] = cache_get_field_content_int(i,"ped_World", MysqlConnect);
ped_Actor[i][ped_Interier] = cache_get_field_content_int(i,"ped_Interier", MysqlConnect);
count++;
//--------------------
CreateActorServer(i,ped_Actor[i][ped_Skin], ped_Actor[i][ped_Pos][0],ped_Actor[i][ped_Pos][1],ped_Actor[i][ped_Pos][2],ped_Actor[i][ped_Pos][3], 0, 100.0, ped_Actor[i][ped_World], ped_Actor[i][ped_Interier]);
}
return 1;
}



stock CreateActorServer(i,model, Float:x,Float:y, Float:z, Float:a,invulnerable = 1, Float:health = 100.0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_ACTOR_SD, areaid = -1, priority = 0)
{
new bot_id = i;
bot_id = CreateDynamicActor(model, x,y,z,a,invulnerable,health, worldid, interiorid, playerid,streamdistance, areaid, priority);
if(bot_id != INVALID_ACTOR_ID)
{
ped_Actor[bot_id][IdActor3dText] = CreateDynamic3DTextLabel("-",COLOR_ALOGIN,x,y,z+ACTOR_CHAT_TEXT_OFFSET_HEIGHT,5.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1, worldid, interiorid, -1, 10.0);
UpdateDynamic3DTextLabelText(ped_Actor[bot_id][IdActor3dText],COLOR_ALOGIN,"");

new str[45];
format(str, sizeof(str), "[%d] %s",bot_id, ped_Actor[bot_id-1][ped_Names]);
ped_Actor[bot_id][IdActor3dName] = CreateDynamic3DTextLabel(str, -1,x,y,z+1.1, 15.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID,1,worldid, interiorid, -1, 10.0);
UpdateDynamic3DTextLabelText(ped_Actor[bot_id][IdActor3dName],-1,str);
//========//
if(ped_Actor[bot_id][ped_Timer] == 0)
{
ped_Actor[bot_id][ped_Timer] = SetTimerEx("OnActorTimer", 78000, true, "dd",bot_id);
}
CreateActorAnim();
}
return bot_id;
}

Pa4enka
04.04.2021, 02:40
stock CreateActorServer(i,model, Float:x,Float:y, Float:z, Float:a,invulnerable = 1, Float:health = 100.0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_ACTOR_SD, areaid = -1, priority = 0)
{
new bot_id;
bot_id = CreateDynamicActor(model, x,y,z,a,invulnerable,health, worldid, interiorid, playerid,streamdistance, areaid, priority);
if(bot_id != INVALID_ACTOR_ID)
{
ped_Actor[i][IdActor3dText] = CreateDynamic3DTextLabel("-",COLOR_ALOGIN,x,y,z+ACTOR_CHAT_TEXT_OFFSET_HEIGHT,5.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1, worldid, interiorid, -1, 10.0);
UpdateDynamic3DTextLabelText(ped_Actor[i][IdActor3dText],COLOR_ALOGIN,"");

new str[45];
format(str, sizeof(str), "[%d] %s",bot_id, ped_Actor[i][ped_Names]);
ped_Actor[i][IdActor3dName] = CreateDynamic3DTextLabel(str, -1,x,y,z+1.1, 15.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID,1,worldid, interiorid, -1, 10.0);
UpdateDynamic3DTextLabelText(ped_Actor[i][IdActor3dName],-1,str);
//========//
if(ped_Actor[i][ped_Timer] == 0)
{
ped_Actor[i][ped_Timer] = SetTimerEx("OnActorTimer", 78000, true, "dd",bot_id);
}
CreateActorAnim();
}
return bot_id;
}

Сергей
04.04.2021, 03:11
stock CreateActorServer(i,model, Float:x,Float:y, Float:z, Float:a,invulnerable = 1, Float:health = 100.0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_ACTOR_SD, areaid = -1, priority = 0)
{
new bot_id;
bot_id = CreateDynamicActor(model, x,y,z,a,invulnerable,health, worldid, interiorid, playerid,streamdistance, areaid, priority);
if(bot_id != INVALID_ACTOR_ID)
{
ped_Actor[i][IdActor3dText] = CreateDynamic3DTextLabel("-",COLOR_ALOGIN,x,y,z+ACTOR_CHAT_TEXT_OFFSET_HEIGHT,5.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1, worldid, interiorid, -1, 10.0);
UpdateDynamic3DTextLabelText(ped_Actor[i][IdActor3dText],COLOR_ALOGIN,"");

new str[45];
format(str, sizeof(str), "[%d] %s",bot_id, ped_Actor[i][ped_Names]);
ped_Actor[i][IdActor3dName] = CreateDynamic3DTextLabel(str, -1,x,y,z+1.1, 15.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID,1,worldid, interiorid, -1, 10.0);
UpdateDynamic3DTextLabelText(ped_Actor[i][IdActor3dName],-1,str);
//========//
if(ped_Actor[i][ped_Timer] == 0)
{
ped_Actor[i][ped_Timer] = SetTimerEx("OnActorTimer", 78000, true, "dd",bot_id);
}
CreateActorAnim();
}
return bot_id;
}

А разница в чём?

Pa4enka
04.04.2021, 03:13
Да там почти каждая строка отличается)0
Попробуй, в целом. Должно сработать.

Сергей
04.04.2021, 03:22
Да там почти каждая строка отличается)0
Попробуй, в целом. Должно сработать.

Для наглядности:
Фотография (https://prnt.sc/113ippj)

Pa4enka
04.04.2021, 03:41
Так работает или нет?))) Меня больше это интересует. Если нужно будет, я уточню детали.

Сергей
04.04.2021, 03:45
Так работает или нет?))) Меня больше это интересует. Если нужно будет, я уточню детали.

Работает, но всё перепутано, но, и опять же в бд, их иды тоже начинаются с 0
Обращаюсь к иду 1, текст показывает правильно, анимация не срабатывает, вместо этого срабатывает у ида 0
Обращаюсь к иду 0, текст показывает, анимация даже не работает.
Если вернуться к моему методу, всё работает так как должно быть, только вот иды ботов иные, они начинаются с 1, и при обращении к этим идам, всё работает так как должно быть



stock SendActorChat(bot_id,visual_time,const text_bot[],color,bool:anims) // сказать боту
{
printf("SendActorChat: %d | ActorID: %d",bot_id,ped_Actor[bot_id][id_Actor]);
if(IsValidDynamicActor(ped_Actor[bot_id][id_Actor]))
{
if(strlen(text_bot) > 0)
{
if(visual_time > 0)
{
if(ped_Actor[bot_id][IdActor3dTextTimer] != 0)
{
KillTimer(ped_Actor[bot_id][IdActor3dTextTimer]);
ped_Actor[bot_id][IdActor3dTextTimer] = 0;
}
UpdateDynamic3DTextLabelText(ped_Actor[bot_id][IdActor3dText],color,text_bot);
ped_Actor[bot_id][IdActor3dTextTimer] = SetTimerEx("OnActorChatEnd", visual_time, false, "dd",ped_Actor[bot_id][id_Actor]);
if(anims == true) ApplyDynamicActorAnimation(ped_Actor[bot_id][id_Actor], "PED", "IDLE_CHAT", 4.1, 0, 0, 0, 0, visual_time);
return 1;
}
}
}
return 0;
}

Сергей
04.04.2021, 20:04
Подыму

DeimoS
04.04.2021, 23:14
Чтоб всех этих проблем не было, сначала загружай данные о актёре в локальные переменные, после этого создавай актёра по этим данным, записывай его ID и уже этот ID используй как индекс массива, в который уже переноси данные из локальных переменных/создавай всякие 3D тексты и т.п. (вот тут (https://pro-pawn.ru/showthread.php?15801-%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D1%81-%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%BE%D0%B9-%D0%B0%D0%B2%D1%82%D0%BE-%28mysql-r41-3%29&p=88621&viewfull=1#post88621) есть пример такой загрузки).

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


При желании, можешь изначально отнимать от ID актёра единицу, дабы твой массив "ped_Actor" заполнялся с нулевой ячейки, а не с первой. Только это, соответственно, придётся во всём скрипте учитывать всякий раз, когда ты начинаешь пытаться обращаться к данными в массиве по ID актёра, так же отнимая единицу.

Сергей
05.04.2021, 01:26
Чтоб всех этих проблем не было, сначала загружай данные о актёре в локальные переменные, после этого создавай актёра по этим данным, записывай его ID и уже этот ID используй как индекс массива, в который уже переноси данные из локальных переменных/создавай всякие 3D тексты и т.п. (вот тут (https://pro-pawn.ru/showthread.php?15801-%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D1%81-%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%BE%D0%B9-%D0%B0%D0%B2%D1%82%D0%BE-%28mysql-r41-3%29&p=88621&viewfull=1#post88621) есть пример такой загрузки).

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


При желании, можешь изначально отнимать от ID актёра единицу, дабы твой массив "ped_Actor" заполнялся с нулевой ячейки, а не с первой. Только это, соответственно, придётся во всём скрипте учитывать всякий раз, когда ты начинаешь пытаться обращаться к данными в массиве по ID актёра, так же отнимая единицу.

Вообщем попробовал я всё таки сделать:
Опять всё спутано, теперь при обращении к боту, выдает ошибку, что мол такого бота не существует...



forward LoadActorCallBack();
public LoadActorCallBack()
{
new rows, fields;
new time = GetTickCount();
new count = 0;
cache_get_data(rows, fields,MysqlConnect);
if(rows == 0) return 1;
new bot_id = 0,buff_ped_Actor[aCreate_Actor];
for(new i ; i < rows; i++)
{
buff_ped_Actor[id_Actor] = cache_get_field_content_int(i,"id_actor", MysqlConnect);
buff_ped_Actor[ped_Skin] = cache_get_field_content_int(i,"ped_skin", MysqlConnect);
cache_get_field_content(i,"ped_names",buff_ped_Actor[ped_Names], MysqlConnect, 40);
buff_ped_Actor[ped_Pos][0] = cache_get_field_content_float(i,"ped_pos_x", MysqlConnect);
buff_ped_Actor[ped_Pos][1] = cache_get_field_content_float(i,"ped_pos_y", MysqlConnect);
buff_ped_Actor[ped_Pos][2] = cache_get_field_content_float(i,"ped_pos_z", MysqlConnect);
buff_ped_Actor[ped_Pos][3] = cache_get_field_content_float(i,"ped_pos_a", MysqlConnect);
buff_ped_Actor[ped_World] = cache_get_field_content_int(i,"ped_World", MysqlConnect);
buff_ped_Actor[ped_Interier] = cache_get_field_content_int(i,"ped_Interier", MysqlConnect);
count++;
//--------------------
bot_id = CreateActor_Server(buff_ped_Actor[id_Actor],buff_ped_Actor[ped_Skin], buff_ped_Actor[ped_Pos][0],buff_ped_Actor[ped_Pos][1],buff_ped_Actor[ped_Pos][2],buff_ped_Actor[ped_Pos][3], 0, 100.0, buff_ped_Actor[ped_World], buff_ped_Actor[ped_Interier]);
//--------------------
ped_Actor[bot_id][id_Actor] = buff_ped_Actor[id_Actor];
ped_Actor[bot_id][ped_Skin] = buff_ped_Actor[ped_Skin];
strmid(ped_Actor[bot_id][ped_Names], buff_ped_Actor[ped_Names], 0, strlen(buff_ped_Actor[ped_Names]), 40);
ped_Actor[bot_id][ped_Pos][0] = buff_ped_Actor[ped_Pos][0];
ped_Actor[bot_id][ped_Pos][1] = buff_ped_Actor[ped_Pos][1];
ped_Actor[bot_id][ped_Pos][2] = buff_ped_Actor[ped_Pos][2];
ped_Actor[bot_id][ped_Pos][3] = buff_ped_Actor[ped_Pos][3];
ped_Actor[bot_id][ped_World] = buff_ped_Actor[ped_World];
ped_Actor[bot_id][ped_Interier] = buff_ped_Actor[ped_Interier];
//--------------------
printf("Загружены Актеры: ID: %d, bot_id: %d, ID: %d", ped_Actor[bot_id][id_Actor], bot_id, i);
}
printf("[MySQL]: Система педов загружена за %d (ms) | Педов: %d",GetTickCount() - time,count);
return 1;
}

В логе почему-то так:


Загружены Актеры: ID: 0, bot_id: 1, ID: 0
Загружены Актеры: ID: 1, bot_id: 2, ID: 1
Загружены Актеры: ID: 2, bot_id: 3, ID: 2


Создаю:


stock CreateActor_Server(bot_id,model, Float:x,Float:y, Float:z, Float:a,invulnerable = 1, Float:health = 100.0, worldid = -1, interiorid = -1, playerid = -1, Float:streamdistance = STREAMER_ACTOR_SD, areaid = -1, priority = 0)
{
bot_id = CreateDynamicActor(model, x,y,z,a,invulnerable,health, worldid, interiorid, playerid,streamdistance, areaid, priority);
if(bot_id != INVALID_ACTOR_ID)
{
ped_Actor[bot_id][IdActor3dText] = CreateDynamic3DTextLabel("-",COLOR_ALOGIN,x,y,z+ACTOR_CHAT_TEXT_OFFSET_HEIGHT,5.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1, worldid, interiorid, -1, 10.0);
UpdateDynamic3DTextLabelText(ped_Actor[bot_id][IdActor3dText],COLOR_ALOGIN,"");
new str[45];
format(str, sizeof(str), "[%d] %s",bot_id, ped_Actor[bot_id-1][ped_Names]);
ped_Actor[bot_id][IdActor3dName] = CreateDynamic3DTextLabel(str, -1,x,y,z+ACTOR_CHAT_TEXT_OFFSET_HEIGHT+0.1, 15.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID,1,worldid, interiorid, -1, 10.0);
UpdateDynamic3DTextLabelText(ped_Actor[bot_id][IdActor3dName],-1,str);
//========//
if(ped_Actor[bot_id][ped_Timer] == 0)
{
ped_Actor[bot_id][ped_Timer] = SetTimerEx("OnActorTimer", 78000, true, "dd",bot_id);
}
CreateActorAnim();
}
return bot_id;
}

DeimoS
05.04.2021, 06:06
Ну так покажи как ты к боту пытаешься обращаться

Ну и да: какой смысл в переменной count, если её значение, в итоге, будет равно значению переменной rows? :)

Сергей
07.04.2021, 13:39
Ну так покажи как ты к боту пытаешься обращаться

Ну и да: какой смысл в переменной count, если её значение, в итоге, будет равно значению переменной rows? :)



CMD:actortext(playerid,params[])
{
if(sscanf(params, "ds[90]", params[0],params[2])) return SCM(playerid,-1,"Введите команду: '/actortext' [id actor] [text] (-1 id сброс анимации)");
if(ped_Actor[params[0]][id_Actor] != params[0]) return SCMError(playerid,"[Server]: {FFFFFF}Данного актера не найдено на сервере.");
new str_r[91];
format(str_r,sizeof(str_r),"%s",params[2]);

if(strcmp_with_isnull(str_r, "-1", true) == 0)
{
SCM(playerid,COLOR_IVORY,"Анимация сброшена");
ClearDynamicActorAnimations(ped_Actor[params[0]][id_Actor]);
AnimationPED(ped_Actor[params[0]][id_Actor]);
UpdateDynamic3DTextLabelText(ped_Actor[params[0]][IdActor3dText],COLOR_ALOGIN,"");
return 1;
}
new str_s[90];
format(str_s,sizeof(str_s),"Проигрываем анимацию боту: %d",ped_Actor[params[0]][id_Actor]);
SCM(playerid,COLOR_IVORY,str_s);

UpdateDynamic3DTextLabelText(ped_Actor[params[0]][IdActor3dText],COLOR_ALOGIN,str_r);
ped_Actor[params[0]][ped_AnimsReload] = 1;
SendActorChat(ped_Actor[params[0]][id_Actor],6000,str_r,COLOR_ALOGIN,true);
return 1;
}

DeimoS
07.04.2021, 15:14
Эмм, у тебя сейчас очень странная проверка на существование бота. В "id_Actor" ты хранишь ID столбца из таблицы с ботами. Этот ID никак не обязан быть идентичным ID бота на сервере.

Да и, в целом, очень странная изначальная идея проверки, ибо ты записываешь ID бота в массив, индексом которого будет тот же самый ID бота, который ты в него записываешь. Какой в этом смысл?

Сергей
07.04.2021, 16:13
Эмм, у тебя сейчас очень странная проверка на существование бота. В "id_Actor" ты хранишь ID столбца из таблицы с ботами. Этот ID никак не обязан быть идентичным ID бота на сервере.

Да и, в целом, очень странная изначальная идея проверки, ибо ты записываешь ID бота в массив, индексом которого будет тот же самый ID бота, который ты в него записываешь. Какой в этом смысл?

Так вот именно, запутался вообще....

Сергей
07.04.2021, 17:52
Эмм, у тебя сейчас очень странная проверка на существование бота. В "id_Actor" ты хранишь ID столбца из таблицы с ботами. Этот ID никак не обязан быть идентичным ID бота на сервере.

Да и, в целом, очень странная изначальная идея проверки, ибо ты записываешь ID бота в массив, индексом которого будет тот же самый ID бота, который ты в него записываешь. Какой в этом смысл?

Вообщем, я тут снова по пробовал мудрить, и вот что получилось:

Работает нормально:


forward LoadActorCallBack();
public LoadActorCallBack()
{
new rows, fields;
new time = GetTickCount();
cache_get_data(rows, fields,MysqlConnect);
if(rows == 0) return 1;
for(new i; i < rows; i++)
{
ped_Actor[i][id_Actor] = cache_get_field_content_int(i,"id_actor", MysqlConnect);
ped_Actor[i][ped_Skin] = cache_get_field_content_int(i,"ped_skin", MysqlConnect);
cache_get_field_content(i,"ped_names",ped_Actor[i][ped_Names], MysqlConnect, 40);
ped_Actor[i][ped_Pos][0] = cache_get_field_content_float(i,"ped_pos_x", MysqlConnect);
ped_Actor[i][ped_Pos][1] = cache_get_field_content_float(i,"ped_pos_y", MysqlConnect);
ped_Actor[i][ped_Pos][2] = cache_get_field_content_float(i,"ped_pos_z", MysqlConnect);
ped_Actor[i][ped_Pos][3] = cache_get_field_content_float(i,"ped_pos_a", MysqlConnect);
ped_Actor[i][ped_World] = cache_get_field_content_int(i,"ped_World", MysqlConnect);
ped_Actor[i][ped_Interier] = cache_get_field_content_int(i,"ped_Interier", MysqlConnect);

//--------------------
ped_Actor[i][ped_ActorCreate] = CreateDynamicActor(ped_Actor[i][ped_Skin], ped_Actor[i][ped_Pos][0],ped_Actor[i][ped_Pos][1],ped_Actor[i][ped_Pos][2],ped_Actor[i][ped_Pos][3], 0, 100.0, ped_Actor[i][ped_World], ped_Actor[i][ped_Interier]);
//--------------------
ped_Actor[i][IdActor3dText] = CreateDynamic3DTextLabel("-",COLOR_ALOGIN,ped_Actor[i][ped_Pos][0],ped_Actor[i][ped_Pos][1],ped_Actor[i][ped_Pos][2]+ACTOR_CHAT_TEXT_OFFSET_HEIGHT,5.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID,1, ped_Actor[i][ped_World], ped_Actor[i][ped_Interier], -1, 10.0);
UpdateDynamic3DTextLabelText(ped_Actor[i][IdActor3dText],COLOR_ALOGIN,"");

new str[45];
format(str, sizeof(str), "[%d] %s",ped_Actor[i][id_Actor], ped_Actor[i][ped_Names]);
ped_Actor[i][IdActor3dName] = CreateDynamic3DTextLabel(str, -1,ped_Actor[i][ped_Pos][0],ped_Actor[i][ped_Pos][1],ped_Actor[i][ped_Pos][2]+ACTOR_CHAT_TEXT_OFFSET_HEIGHT+0.1, 15.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID,1,ped_Actor[i][ped_World], ped_Actor[i][ped_Interier], -1, 10.0);
UpdateDynamic3DTextLabelText(ped_Actor[i][IdActor3dName],-1,str);
//--------//
if(ped_Actor[i][ped_Timer] == 0)
{
ped_Actor[i][ped_Timer] = SetTimerEx("OnActorTimer", 78000, true, "dd",i);
}
}
printf("[MySQL]: Система педов загружена за %d (ms)",GetTickCount() - time);
return 1;
}

Дальше сделал команду:


CMD:actortext(playerid,params[])
{
if(sscanf(params, "ds[90]", params[0],params[2])) return SCM(playerid,-1,"Введите команду: '/actortext' [id actor] [text] (-1 id сброс анимации)");
new str_r[91];
format(str_r,sizeof(str_r),"%s",params[2]);

if(strcmp_with_isnull(str_r, "-1", true) == 0)
{
SCM(playerid,COLOR_IVORY,"Анимация сброшена");
ClearDynamicActorAnimations(ped_Actor[params[0]][id_Actor]);
AnimationPED(ped_Actor[params[0]][id_Actor]);
UpdateDynamic3DTextLabelText(ped_Actor[params[0]][IdActor3dText],COLOR_ALOGIN,"");
return 1;
}
new str_s[90];
format(str_s,sizeof(str_s),"Проигрываем анимацию боту: %d",params[0]);
SCM(playerid,COLOR_IVORY,str_s);
ped_Actor[params[0]][ped_AnimsReload] = 1;
ServerActorText(params[0],6000,str_r,COLOR_ALOGIN,true);
return 1;
}

Ну и чтобы текст шёл и анимация работала:


stock ServerActorText(bot_id,visual_time,const text_bot[],color,bool:anims)
{
if(strlen(text_bot) > 0)
{
if(visual_time > 0)
{
if(ped_Actor[bot_id][IdActor3dTextTimer] != 0)
{
KillTimer(ped_Actor[bot_id][IdActor3dTextTimer]);
ped_Actor[bot_id][IdActor3dTextTimer] = 0;
}
UpdateDynamic3DTextLabelText(ped_Actor[bot_id][IdActor3dText],color,text_bot);
ped_Actor[bot_id][IdActor3dTextTimer] = SetTimerEx("OnActorChatEnds", visual_time, false, "dd",ped_Actor[bot_id][id_Actor]);
if(anims == true) ApplyDynamicActorAnimation(ped_Actor[bot_id][ped_ActorCreate], "PED", "IDLE_CHAT", 4.1, 0, 0, 0, 0, visual_time);
}
}
return 1;
}

Только вот одно НО:
Почему мне чтобы работало всё нормально приходится использовать:


ped_Actor[bot_id][ped_ActorCreate]

И-то эта штука вообще не соответствует идам:
Т.е я загружаю:

ped_Actor[i][id_Actor] образно 3 актера, их иды грузит как 0,1,2
создаю актера:

ped_Actor[i][ped_ActorCreate], тут создание идёт от 1 до 3
А при использовании текста для актера, всё работает нормально, у каждого актера срабатывает и анимация, и текст над ним, как так то?

DeimoS
08.04.2021, 12:03
Так вот именно, запутался вообще....

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

Как минимум, можно массив для хранения данных о ботах инициализировать невалидным значением (например, "-1") и уже в проверках на существование бота сделать проверку
if(ped_Actor[params[0]][id_Actor] == -1) return SCMError(playerid,"[Server]: {FFFFFF}Данного актера не найдено на сервере.");




ped_Actor[bot_id][ped_ActorCreate]

И-то эта штука вообще не соответствует идам:
Т.е я загружаю:

ped_Actor[i][id_Actor] образно 3 актера, их иды грузит как 0,1,2

Я тебе это в предыдущем сообщении уже объяснял. Да и ты сам можешь просто посмотреть код загрузки, чтоб узнать что именно в эту переменную загружается.


Твоя единственная сейчас проблема в том, что ты не хочешь сесть и разобраться в том коде, что тебе дали. Не только в том, как код работает, но и в том, какое предназначение будет у тех или иных переменных и какие значения эти переменные смогут вообще хранить.

Сергей
08.04.2021, 22:04
Ну так если запутался, то стоит разобраться какой именно принцип работы у того кода, что я тебе предлагал, а не просто под копирку всё сделать и сидеть, ничего не понимая.

Как минимум, можно массив для хранения данных о ботах инициализировать невалидным значением (например, "-1") и уже в проверках на существование бота сделать проверку
if(ped_Actor[params[0]][id_Actor] == -1) return SCMError(playerid,"[Server]: {FFFFFF}Данного актера не найдено на сервере.");



Я тебе это в предыдущем сообщении уже объяснял. Да и ты сам можешь просто посмотреть код загрузки, чтоб узнать что именно в эту переменную загружается.


Твоя единственная сейчас проблема в том, что ты не хочешь сесть и разобраться в том коде, что тебе дали. Не только в том, как код работает, но и в том, какое предназначение будет у тех или иных переменных и какие значения эти переменные смогут вообще хранить.

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

ihNNNNNify
09.04.2021, 00:08
forward LoadActorCallBack();
public LoadActorCallBack()
{
new rows, fields;
new time = GetTickCount();
new count = 0;
cache_get_data(rows, fields,MysqlConnect);
if(rows == 0) return 1;
for(new i = 0, id; i < rows; i++)
{
id = ped_Actor[i][id_Actor] = cache_get_field_content_int(i,"id_actor", MysqlConnect);
ped_Actor[id][ped_Skin] = cache_get_field_content_int(i,"ped_skin", MysqlConnect);
cache_get_field_content(i,"ped_names", ped_Actor[id][ped_Names], MysqlConnect, 40);
ped_Actor[id][ped_Pos][0] = cache_get_field_content_float(i,"ped_pos_x", MysqlConnect);
ped_Actor[id][ped_Pos][1] = cache_get_field_content_float(i,"ped_pos_y", MysqlConnect);
ped_Actor[id][ped_Pos][2] = cache_get_field_content_float(i,"ped_pos_z", MysqlConnect);
ped_Actor[id][ped_Pos][3] = cache_get_field_content_float(i,"ped_pos_a", MysqlConnect);
ped_Actor[id][ped_World] = cache_get_field_content_int(i,"ped_World", MysqlConnect);
ped_Actor[id][ped_Interier] = cache_get_field_content_int(i,"ped_Interier", MysqlConnect);
count++;
//--------------------
CreateActorServer(id, ped_Actor[id][ped_Skin], ped_Actor[id][ped_Pos][0],ped_Actor[id][ped_Pos][1],ped_Actor[id][ped_Pos][2],ped_Actor[id][ped_Pos][3], 0, 100.0, ped_Actor[id][ped_World], ped_Actor[id][ped_Interier]);
}
return 1;
}

DeimoS
09.04.2021, 00:12
Так пытался разобраться, сделал даже другой метод, но, всё рано не вяжется у меня, не пойму...
Путанится происходит в том, что как мне дальше это всё дело использовать...

Так в чём путаница? У тебя есть реальный ID актёра на сервере. Этот же ID используешь для обращения к массиву. Всё. В чём тут можно запутаться? Тебе осталось переписать прошлый код под этот принцип и всё у тебя будет работать.

UPD: Эмм, я тут оказывается не заметил, что ты, в итоге, опять какую-то фигню намудрил с кодом в этом (https://pro-pawn.ru/showthread.php?17277-%D0%9D%D0%B0%D0%BC%D1%83%D0%B4%D1%80%D0%B8%D0%BB-%D1%81-%D0%90%D0%BA%D1%82%D0%B5%D1%80%D0%B0%D0%BC%D0%B8&p=97754&viewfull=1#post97754) сообщении. Я тебе уже показал как правильно нужно реализовывать загрузку твоих данных с учётом того, как ты потом хочешь к ним обращаться. Зачем ты опять откатился к старому варианту, который, как я уже раз в пятый повторяю, НЕ ГАРАНТИРУЕТ ТЕБЕ, ЧТО ID АКТЁРА И ИНДЕКС МАССИВА ОКАЖУТСЯ ОДИНАКОВЫМИ? :fool: Вчитывайся в то, что тебе пишут, пожалуйста.




forward LoadActorCallBack();
public LoadActorCallBack()
{
new rows, fields;
new time = GetTickCount();
new count = 0;
cache_get_data(rows, fields,MysqlConnect);
if(rows == 0) return 1;
for(new i = 0, id; i < rows; i++)
{
id = ped_Actor[i][id_Actor] = cache_get_field_content_int(i,"id_actor", MysqlConnect);
ped_Actor[id][ped_Skin] = cache_get_field_content_int(i,"ped_skin", MysqlConnect);
cache_get_field_content(i,"ped_names", ped_Actor[id][ped_Names], MysqlConnect, 40);
ped_Actor[id][ped_Pos][0] = cache_get_field_content_float(i,"ped_pos_x", MysqlConnect);
ped_Actor[id][ped_Pos][1] = cache_get_field_content_float(i,"ped_pos_y", MysqlConnect);
ped_Actor[id][ped_Pos][2] = cache_get_field_content_float(i,"ped_pos_z", MysqlConnect);
ped_Actor[id][ped_Pos][3] = cache_get_field_content_float(i,"ped_pos_a", MysqlConnect);
ped_Actor[id][ped_World] = cache_get_field_content_int(i,"ped_World", MysqlConnect);
ped_Actor[id][ped_Interier] = cache_get_field_content_int(i,"ped_Interier", MysqlConnect);
count++;
//--------------------
CreateActorServer(id, ped_Actor[id][ped_Skin], ped_Actor[id][ped_Pos][0],ped_Actor[id][ped_Pos][1],ped_Actor[id][ped_Pos][2],ped_Actor[id][ped_Pos][3], 0, 100.0, ped_Actor[id][ped_World], ped_Actor[id][ped_Interier]);
}
return 1;
}

В итоге и информация из "id_Actor" останется непонятно в какой ячейке, и не будет никакой гарантии того, что индекс массива будет равен ID актёра :)

Сергей
10.04.2021, 19:21
Так в чём путаница? У тебя есть реальный ID актёра на сервере. Этот же ID используешь для обращения к массиву. Всё. В чём тут можно запутаться? Тебе осталось переписать прошлый код под этот принцип и всё у тебя будет работать.

UPD: Эмм, я тут оказывается не заметил, что ты, в итоге, опять какую-то фигню намудрил с кодом в этом (https://pro-pawn.ru/showthread.php?17277-%D0%9D%D0%B0%D0%BC%D1%83%D0%B4%D1%80%D0%B8%D0%BB-%D1%81-%D0%90%D0%BA%D1%82%D0%B5%D1%80%D0%B0%D0%BC%D0%B8&p=97754&viewfull=1#post97754) сообщении. Я тебе уже показал как правильно нужно реализовывать загрузку твоих данных с учётом того, как ты потом хочешь к ним обращаться. Зачем ты опять откатился к старому варианту, который, как я уже раз в пятый повторяю, НЕ ГАРАНТИРУЕТ ТЕБЕ, ЧТО ID АКТЁРА И ИНДЕКС МАССИВА ОКАЖУТСЯ ОДИНАКОВЫМИ? :fool: Вчитывайся в то, что тебе пишут, пожалуйста.




В итоге и информация из "id_Actor" останется непонятно в какой ячейке, и не будет никакой гарантии того, что индекс массива будет равен ID актёра :)

Перечитал ещё все ваши советы по нескольку раз, и понял, благодарю.

Сергей
14.04.2021, 20:15
Так в чём путаница? У тебя есть реальный ID актёра на сервере. Этот же ID используешь для обращения к массиву. Всё. В чём тут можно запутаться? Тебе осталось переписать прошлый код под этот принцип и всё у тебя будет работать.

UPD: Эмм, я тут оказывается не заметил, что ты, в итоге, опять какую-то фигню намудрил с кодом в этом (https://pro-pawn.ru/showthread.php?17277-%D0%9D%D0%B0%D0%BC%D1%83%D0%B4%D1%80%D0%B8%D0%BB-%D1%81-%D0%90%D0%BA%D1%82%D0%B5%D1%80%D0%B0%D0%BC%D0%B8&p=97754&viewfull=1#post97754) сообщении. Я тебе уже показал как правильно нужно реализовывать загрузку твоих данных с учётом того, как ты потом хочешь к ним обращаться. Зачем ты опять откатился к старому варианту, который, как я уже раз в пятый повторяю, НЕ ГАРАНТИРУЕТ ТЕБЕ, ЧТО ID АКТЁРА И ИНДЕКС МАССИВА ОКАЖУТСЯ ОДИНАКОВЫМИ? :fool: Вчитывайся в то, что тебе пишут, пожалуйста.




В итоге и информация из "id_Actor" останется непонятно в какой ячейке, и не будет никакой гарантии того, что индекс массива будет равен ID актёра :)

Вопрос ещё такой есть, почему появляется ид 0, и при телепортировании к нему, я попадаю на координаты 0.0,0.0,0.0, по сути его как не существует, но, ему можно проиграть и анимацию, и проверка на него как не работает:


if(ped_Actor[params[0]][ped_ActorCreate] != params[0]) return SCMError(playerid,"[Server]: {FFFFFF}Данного актера не найдено на сервере.");

DeimoS
14.04.2021, 20:22
Потому что проверка кривая? Что ты этим вообще проверять пытаешься? Я выше уже на этот счёт отвечал тебе.

Сергей
15.04.2021, 02:13
Потому что проверка кривая? Что ты этим вообще проверять пытаешься? Я выше уже на этот счёт отвечал тебе.

Как сделать то? Покажите, пожалуйста.

DeimoS
15.04.2021, 02:24
При желании, можешь изначально отнимать от ID актёра единицу, дабы твой массив "ped_Actor" заполнялся с нулевой ячейки, а не с первой. Только это, соответственно, придётся во всём скрипте учитывать всякий раз, когда ты начинаешь пытаться обращаться к данными в массиве по ID актёра, так же отнимая единицу.



Как минимум, можно массив для хранения данных о ботах инициализировать невалидным значением (например, "-1") и уже в проверках на существование бота сделать проверку
if(ped_Actor[params[0]][id_Actor] == -1) return SCMError(playerid,"[Server]: {FFFFFF}Данного актера не найдено на сервере.");

...

Сергей
15.04.2021, 02:28
...

Переделал проверку, но, теперь вопрос в другом становится, ввожу ид, которого на сервере не существует, и команда срабатывает на ид 0

DeimoS
15.04.2021, 09:14
Ну значит криво написал команду. Как я и говорил: всё, что от тебя требуется - это понять каким образом работает тот метод загрузки, который я тебе дал, и переписать с нуля весь остальной код под этот метод. Достаточно просто разобрать код и включить логику. Никаких невероятных знаний твоя система не требует для написания себя.

DeimoS
15.04.2021, 15:56
Собственно, вот (https://pro-pawn.ru/showthread.php?17285-%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B0%D0%BA%D1%82%D1%91%D1%80%D0%BE%D0%B2-%D0%BF%D1%80%D1%8F%D0%BC%D0%BE-%D0%B8%D0%B7-%D0%B8%D0%B3%D1%80%D1%8B-MySQL)