Просмотр полной версии : [Вопрос] Намудрил с Актерами
Доброго времени суток, что-то запутался, и разобраться не могу, намудрил что-то...
Вообщем, решил я значит актеров перенести в БД, ну сделал всё чётко, а потом начались проблемы с их идами...
Я хочу обращаться к ним по 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;
}
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;
}
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;
}
А разница в чём?
Да там почти каждая строка отличается)0
Попробуй, в целом. Должно сработать.
Да там почти каждая строка отличается)0
Попробуй, в целом. Должно сработать.
Для наглядности:
Фотография (https://prnt.sc/113ippj)
Так работает или нет?))) Меня больше это интересует. Если нужно будет, я уточню детали.
Так работает или нет?))) Меня больше это интересует. Если нужно будет, я уточню детали.
Работает, но всё перепутано, но, и опять же в бд, их иды тоже начинаются с 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;
}
Чтоб всех этих проблем не было, сначала загружай данные о актёре в локальные переменные, после этого создавай актёра по этим данным, записывай его 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 актёра, так же отнимая единицу.
Чтоб всех этих проблем не было, сначала загружай данные о актёре в локальные переменные, после этого создавай актёра по этим данным, записывай его 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;
}
Ну так покажи как ты к боту пытаешься обращаться
Ну и да: какой смысл в переменной count, если её значение, в итоге, будет равно значению переменной rows? :)
Ну так покажи как ты к боту пытаешься обращаться
Ну и да: какой смысл в переменной 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;
}
Эмм, у тебя сейчас очень странная проверка на существование бота. В "id_Actor" ты хранишь ID столбца из таблицы с ботами. Этот ID никак не обязан быть идентичным ID бота на сервере.
Да и, в целом, очень странная изначальная идея проверки, ибо ты записываешь ID бота в массив, индексом которого будет тот же самый ID бота, который ты в него записываешь. Какой в этом смысл?
Эмм, у тебя сейчас очень странная проверка на существование бота. В "id_Actor" ты хранишь ID столбца из таблицы с ботами. Этот ID никак не обязан быть идентичным ID бота на сервере.
Да и, в целом, очень странная изначальная идея проверки, ибо ты записываешь ID бота в массив, индексом которого будет тот же самый ID бота, который ты в него записываешь. Какой в этом смысл?
Так вот именно, запутался вообще....
Эмм, у тебя сейчас очень странная проверка на существование бота. В "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
А при использовании текста для актера, всё работает нормально, у каждого актера срабатывает и анимация, и текст над ним, как так то?
Так вот именно, запутался вообще....
Ну так если запутался, то стоит разобраться какой именно принцип работы у того кода, что я тебе предлагал, а не просто под копирку всё сделать и сидеть, ничего не понимая.
Как минимум, можно массив для хранения данных о ботах инициализировать невалидным значением (например, "-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
Я тебе это в предыдущем сообщении уже объяснял. Да и ты сам можешь просто посмотреть код загрузки, чтоб узнать что именно в эту переменную загружается.
Твоя единственная сейчас проблема в том, что ты не хочешь сесть и разобраться в том коде, что тебе дали. Не только в том, как код работает, но и в том, какое предназначение будет у тех или иных переменных и какие значения эти переменные смогут вообще хранить.
Ну так если запутался, то стоит разобраться какой именно принцип работы у того кода, что я тебе предлагал, а не просто под копирку всё сделать и сидеть, ничего не понимая.
Как минимум, можно массив для хранения данных о ботах инициализировать невалидным значением (например, "-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;
}
Так пытался разобраться, сделал даже другой метод, но, всё рано не вяжется у меня, не пойму...
Путанится происходит в том, что как мне дальше это всё дело использовать...
Так в чём путаница? У тебя есть реальный 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 актёра :)
Так в чём путаница? У тебя есть реальный 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 актёра :)
Перечитал ещё все ваши советы по нескольку раз, и понял, благодарю.
Так в чём путаница? У тебя есть реальный 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}Данного актера не найдено на сервере.");
Потому что проверка кривая? Что ты этим вообще проверять пытаешься? Я выше уже на этот счёт отвечал тебе.
Потому что проверка кривая? Что ты этим вообще проверять пытаешься? Я выше уже на этот счёт отвечал тебе.
Как сделать то? Покажите, пожалуйста.
При желании, можешь изначально отнимать от ID актёра единицу, дабы твой массив "ped_Actor" заполнялся с нулевой ячейки, а не с первой. Только это, соответственно, придётся во всём скрипте учитывать всякий раз, когда ты начинаешь пытаться обращаться к данными в массиве по ID актёра, так же отнимая единицу.
Как минимум, можно массив для хранения данных о ботах инициализировать невалидным значением (например, "-1") и уже в проверках на существование бота сделать проверку
if(ped_Actor[params[0]][id_Actor] == -1) return SCMError(playerid,"[Server]: {FFFFFF}Данного актера не найдено на сервере.");
...
...
Переделал проверку, но, теперь вопрос в другом становится, ввожу ид, которого на сервере не существует, и команда срабатывает на ид 0
Ну значит криво написал команду. Как я и говорил: всё, что от тебя требуется - это понять каким образом работает тот метод загрузки, который я тебе дал, и переписать с нуля весь остальной код под этот метод. Достаточно просто разобрать код и включить логику. Никаких невероятных знаний твоя система не требует для написания себя.
Собственно, вот (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)
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot