Ну так покажи как ты к боту пытаешься обращаться
Ну и да: какой смысл в переменной count, если её значение, в итоге, будет равно значению переменной rows? :)
Вид для печати
Ну так покажи как ты к боту пытаешься обращаться
Ну и да: какой смысл в переменной count, если её значение, в итоге, будет равно значению переменной rows? :)
PHP код:
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;
}
Эмм, у тебя сейчас очень странная проверка на существование бота. В "id_Actor" ты хранишь ID столбца из таблицы с ботами. Этот ID никак не обязан быть идентичным ID бота на сервере.
Да и, в целом, очень странная изначальная идея проверки, ибо ты записываешь ID бота в массив, индексом которого будет тот же самый ID бота, который ты в него записываешь. Какой в этом смысл?
Вообщем, я тут снова по пробовал мудрить, и вот что получилось:
Работает нормально:
Дальше сделал команду:PHP код:
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;
}
Ну и чтобы текст шёл и анимация работала:PHP код:
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;
}
Только вот одно НО:PHP код:
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
Ну так если запутался, то стоит разобраться какой именно принцип работы у того кода, что я тебе предлагал, а не просто под копирку всё сделать и сидеть, ничего не понимая.
Как минимум, можно массив для хранения данных о ботах инициализировать невалидным значением (например, "-1") и уже в проверках на существование бота сделать проверку
if(ped_Actor[params[0]][id_Actor] == -1) return SCMError(playerid,"[Server]: {FFFFFF}Данного актера не найдено на сервере.");
Я тебе это в предыдущем сообщении уже объяснял. Да и ты сам можешь просто посмотреть код загрузки, чтоб узнать что именно в эту переменную загружается.
Твоя единственная сейчас проблема в том, что ты не хочешь сесть и разобраться в том коде, что тебе дали. Не только в том, как код работает, но и в том, какое предназначение будет у тех или иных переменных и какие значения эти переменные смогут вообще хранить.
PHP код:
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 актёра на сервере. Этот же ID используешь для обращения к массиву. Всё. В чём тут можно запутаться? Тебе осталось переписать прошлый код под этот принцип и всё у тебя будет работать.
UPD: Эмм, я тут оказывается не заметил, что ты, в итоге, опять какую-то фигню намудрил с кодом в этом сообщении. Я тебе уже показал как правильно нужно реализовывать загрузку твоих данных с учётом того, как ты потом хочешь к ним обращаться. Зачем ты опять откатился к старому варианту, который, как я уже раз в пятый повторяю, НЕ ГАРАНТИРУЕТ ТЕБЕ, ЧТО ID АКТЁРА И ИНДЕКС МАССИВА ОКАЖУТСЯ ОДИНАКОВЫМИ? :fool: Вчитывайся в то, что тебе пишут, пожалуйста.
В итоге и информация из "id_Actor" останется непонятно в какой ячейке, и не будет никакой гарантии того, что индекс массива будет равен ID актёра :)