CMD:createactor(playerid, params[])
{
new modelid;
new invulnerable;
new Float:health;
new name[MAX_ACTOR_NAME];
if(sscanf(params
, "iS()["#MAX_ACTOR_NAME"]I(1)F(100)", modelid, name, invulnerable, health)) {
"Используйте: /createactor [Model (0-73, 75-311)] <Имя> <Бессмертие (0-1)> <Здоровье>");
SendClientMessage(playerid
, 0xAAAAAAFF, "Параметры в угловых скобках не обязательны."); return 1;
}
if(!(0 <= modelid <= 73) && !(75 <= modelid <= 311))
{
SendClientMessage(playerid
, 0xAAAAAAFF, "Ошибка: Допустимые значения для ModelID: 0-73, 75-311"); return 1;
}
if(!(0 <= invulnerable <= 1))
{
SendClientMessage(playerid
, 0xAAAAAAFF, "Ошибка: Допустимые значения для invulnerable: 0-1"); return 1;
}
if(health <= 0.0)
{
SendClientMessage(playerid
, 0xAAAAAAFF, "Ошибка: Здоровье не может быть меньше или равно нулю."); return 1;
}
new Float:x;
new Float:y;
new Float:z;
new Float:a;
new idx = CreateDynamicActor(modelid, x, y, z, a, invulnerable, health, worldid, interiorid);
if(idx == INVALID_ACTOR_ID)
{
SendClientMessage(playerid
, 0xAAAAAAFF, "Ошибка: На сервере создано максимальное количество актёров."); return 1;
}
Iter_Add(iActors, idx);
ActorInfo[idx][actor_Name][0] = '\0';
strcat(ActorInfo
[idx
][actor_Name
], name
, MAX_ACTOR_NAME
); ActorInfo[idx][actor_ModelID] = modelid;
ActorInfo[idx][actor_PosX] = x;
ActorInfo[idx][actor_PosY] = y;
ActorInfo[idx][actor_PosZ] = z;
ActorInfo[idx][actor_PosA] = a;
ActorInfo[idx][actor_Invulnerable] = invulnerable;
ActorInfo[idx][actor_Health] = health;
ActorInfo[idx][actor_VirtualWorld] = worldid;
ActorInfo[idx][actor_Interior] = interiorid;
CreateActor3DText(idx);
new query_string[12+11+4+(8+MAX_ACTOR_NAME)+(10+3)+(7+11)+(7+11)+(7+11)+(7+11)+(14+1)+(8+11)+(15+11)+(9+11)+1];
mysql_format(ACTOR_DB_HANDLE, query_string, sizeof(query_string),
"\
INSERT INTO \
actor_list \
SET \
name='%e',\
model_id=%d,\
pos_x=%f,\
pos_y=%f,\
pos_z=%f,\
pos_a=%f,\
invulnerable=%d,\
health=%f,\
virtual_world=%d,\
interior=%d\
",
name,
modelid,
x,
y,
z,
a,
invulnerable,
health,
worldid,
interiorid);
mysql_tquery(ACTOR_DB_HANDLE, query_string, "@MySQL__GetActorTableID", "i", idx);
return 1;
}
@MySQL__GetActorTableID(idx);
@MySQL__GetActorTableID(idx)
{
ActorInfo[idx][actor_TableID] = cache_insert_id();
}
CMD:editactor(playerid, params[])
{
new actor_id = -1;
if(sscanf(params
, "i", actor_id
)) {
new Float:x;
new Float:y;
new Float:z;
foreach(new i: iActors)
{
if(!IsDynamicActorInRangeOfPoint(i, 1.0, x, y, z))
continue;
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
return 1;
}
if(!Iter_Contains(iActors, actor_id))
{
SendClientMessage(playerid
, 0xAAAAAAFF, "Ошибка: Указанный актёр не найден или создан не через систему создания актёров."); return 1;
}
SetPVarInt(playerid
, pVar__EditActor_ID
, actor_id
); Dialog_Show(playerid, dEditActor_Main);
return 1;
}
DialogCreate:dEditActor_Main(playerid)
{
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#001]. Повторите попытку."); return;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
new dialog_string[8+(14+MAX_ACTOR_NAME)+(25+3)+(29+10)+(27+13)+(34+11)+(27+11)+28+17+1] = "{FFFFFF}";
format(dialog_string
, sizeof(dialog_string
), "\
Имя:\t{009900}%s\n\
{FFFFFF}Модель:\t{009900}%d\n\
{FFFFFF}Бессмертие:\t{009900}%s\n\
{FFFFFF}Здоровье:\t{009900}%0.2f\n\
{FFFFFF}Виртуальный мир:\t{009900}%d\n\
{FFFFFF}Интерьер:\t{009900}%d\n\
{FFFFFF}• Изменить позицию\t\n\
• Удалить актёра\t\n\
",
ActorInfo[idx][actor_Name],
ActorInfo[idx][actor_ModelID],
ActorInfo[idx][actor_Invulnerable] ? ("Бессмертен") : ("Смертен"),
ActorInfo[idx][actor_Health],
ActorInfo[idx][actor_VirtualWorld],
ActorInfo[idx][actor_Interior]);
Dialog_Open(playerid, dEditActor_Main, DIALOG_STYLE_TABLIST,
"Редактирование актёра", dialog_string, "Далее", "Закрыть");
}
DialogResponse:dEditActor_Main(playerid, response, listitem, inputtext[])
{
if(!response)
{
return 1;
}
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#002]. Повторите попытку."); return 1;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
); switch(listitem)
{
case 0:
{
Dialog_Show(playerid, dEditActor_SetName);
}
case 1:
{
Dialog_Show(playerid, dEditActor_Model);
}
case 2:
{
ActorInfo[idx][actor_Invulnerable] = !ActorInfo[idx][actor_Invulnerable];
UpdateActorData(idx, actor_Invulnerable);
Streamer_SetIntData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_INVULNERABLE, ActorInfo[idx][actor_Invulnerable]);
Streamer_Update(playerid, STREAMER_TYPE_ACTOR);
Dialog_Show(playerid, dEditActor_Main);
}
case 3:
{
Dialog_Show(playerid, dEditActor_Health);
}
case 4:
{
Dialog_Show(playerid, dEditActor_VW);
}
case 5:
{
Dialog_Show(playerid, dEditActor_Interior);
}
case 6:
{
SendClientMessage(playerid
, 0x00AA00AA, "Вы перешли в режим редактирования координат актёра."); SendClientMessage(playerid
, 0x00AA00AA, "Встаньте на желаемую позицию и нажмите на \"~k~~CONVERSATION_YES~\"."); SendClientMessage(playerid
, 0x00AA00AA, "Для выхода из режима без изменения координат нажмите \"~k~~CONVERSATION_YES~\"."); }
case 7:
{
Dialog_Show(playerid, dEditActor_Delete);
}
}
return 1;
}
DialogInterrupt:dEditActor_Main(playerid)
{
return 1;
}
DialogCreate:dEditActor_SetName(playerid)
{
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#003]. Повторите попытку."); return;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
new dialog_string[8+(30+MAX_ACTOR_NAME)+1+30+1];
format(dialog_string
, sizeof(dialog_string
), "{FFFFFF}\
Текущее имя: {00AA00}%s{FFFFFF}\n\
\n\
Укажите новое имя в окно ниже:\
", ActorInfo[idx][actor_Name]);
Dialog_Open(playerid, dEditActor_SetName, DIALOG_STYLE_INPUT,
"Редактирование актёра [Имя]", dialog_string, "Изменить", "Назад");
}
DialogResponse:dEditActor_SetName(playerid, response, listitem, inputtext[])
{
if(!response)
{
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
if(strlen(inputtext
) > MAX_ACTOR_NAME
) {
SendClientMessage(playerid
, 0xAAAAAAFF, "Ошибка: Имя не должно быть длиннее "#MAX_ACTOR_NAME" символов."); Dialog_Show(playerid, dEditActor_SetName);
return 1;
}
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#004]. Повторите попытку."); return 1;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
if(isnull(inputtext))
{
if(isnull(ActorInfo[idx][actor_Name]))
{
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
else
{
ActorInfo[idx][actor_Name][0] = '\0';
DestroyDynamic3DTextLabel(ActorInfo[idx][actor_3DText]);
}
}
else
{
if(isnull(ActorInfo[idx][actor_Name]))
{
strcat(ActorInfo
[idx
][actor_Name
], inputtext
, MAX_ACTOR_NAME
); CreateActor3DText(idx);
Streamer_Update(playerid, STREAMER_TYPE_3D_TEXT_LABEL);
}
else
{
ActorInfo[idx][actor_Name][0] = '\0';
strcat(ActorInfo
[idx
][actor_Name
], inputtext
, MAX_ACTOR_NAME
); UpdateDynamic3DTextLabelText(ActorInfo[idx][actor_3DText], ACTOR_COLOR_3D_TEXT, inputtext);
Streamer_Update(playerid, STREAMER_TYPE_3D_TEXT_LABEL);
}
}
UpdateActorData(idx, actor_Name);
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
DialogInterrupt:dEditActor_SetName(playerid)
{
return 1;
}
DialogCreate:dEditActor_Model(playerid)
{
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#005]. Повторите попытку."); return;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
new dialog_string[8+(30+3)+1+30+1];
format(dialog_string
, sizeof(dialog_string
), "{FFFFFF}\
Текущая модель: {00AA00}%d{FFFFFF}\n\
\n\
Укажите новую модель в окно ниже:\
", ActorInfo[idx][actor_ModelID]);
Dialog_Open(playerid, dEditActor_Model, DIALOG_STYLE_INPUT,
"Редактирование актёра [ID скина]", dialog_string, "Изменить", "Назад");
}
DialogResponse:dEditActor_Model(playerid, response, listitem, inputtext[])
{
if(!response)
{
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
new model_id;
if(sscanf(inputtext
, "i", model_id
)) {
Dialog_Show(playerid, dEditActor_Model);
return 1;
}
if(!(0 <= model_id <= 73) && !(75 <= model_id <= 311))
{
SendClientMessage(playerid
, 0xAAAAAAFF, "Ошибка: Допустимые значения для модели: 0-73, 75-311"); Dialog_Show(playerid, dEditActor_Model);
return 1;
}
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#006]. Повторите попытку."); return 1;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
ActorInfo[idx][actor_ModelID] = model_id;
UpdateActorData(idx, actor_ModelID);
Streamer_SetIntData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_MODEL_ID, model_id);
Streamer_Update(playerid, STREAMER_TYPE_ACTOR);
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
DialogInterrupt:dEditActor_Model(playerid)
{
return 1;
}
DialogCreate:dEditActor_Health(playerid)
{
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#007]. Повторите попытку."); return;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
new dialog_string[8+(35+13)+1+35+1];
format(dialog_string
, sizeof(dialog_string
), "{FFFFFF}\
Текущее здоровье: {00AA00}%0.2f{FFFFFF}\n\
\n\
Укажите новое значение в окно ниже:\
", ActorInfo[idx][actor_Health]);
Dialog_Open(playerid, dEditActor_Health, DIALOG_STYLE_INPUT,
"Редактирование актёра [Здоровье]", dialog_string, "Изменить", "Назад");
}
DialogResponse:dEditActor_Health(playerid, response, listitem, inputtext[])
{
if(!response)
{
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
new Float:health;
if(sscanf(inputtext
, "f", health
)) {
Dialog_Show(playerid, dEditActor_Health);
return 1;
}
if(health <= 0.0)
{
SendClientMessage(playerid
, 0xAAAAAAFF, "Ошибка: Здоровье не может быть меньше или равно нулю."); Dialog_Show(playerid, dEditActor_Health);
return 1;
}
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#008]. Повторите попытку."); return 1;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
ActorInfo[idx][actor_Health] = health;
UpdateActorData(idx, actor_Health);
Streamer_SetFloatData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_HEALTH, health);
Streamer_Update(playerid, STREAMER_TYPE_ACTOR);
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
DialogInterrupt:dEditActor_Health(playerid)
{
return 1;
}
DialogCreate:dEditActor_VW(playerid)
{
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#009]. Повторите попытку."); return;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
new dialog_string[8+(42+11)+1+42+1];
format(dialog_string
, sizeof(dialog_string
), "{FFFFFF}\
Текущий виртуальный мир: {00AA00}%d{FFFFFF}\n\
\n\
Укажите новый виртуальный мир в окно ниже:\
", ActorInfo[idx][actor_VirtualWorld]);
Dialog_Open(playerid, dEditActor_VW, DIALOG_STYLE_INPUT,
"Редактирование актёра [Виртуальный мир]", dialog_string, "Изменить", "Назад");
}
DialogResponse:dEditActor_VW(playerid, response, listitem, inputtext[])
{
if(!response)
{
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
new virtual_world;
if(sscanf(inputtext
, "i", virtual_world
)) {
Dialog_Show(playerid, dEditActor_VW);
return 1;
}
if(virtual_world < -1)
{
SendClientMessage(playerid
, 0xAAAAAAFF, "Ошибка: Виртуальный мир не может быть меньше -1!"); Dialog_Show(playerid, dEditActor_VW);
return 1;
}
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#010]. Повторите попытку."); return 1;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
ActorInfo[idx][actor_VirtualWorld] = virtual_world;
UpdateActorData(idx, actor_VirtualWorld);
Streamer_SetIntData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_WORLD_ID, virtual_world);
Streamer_SetIntData(STREAMER_TYPE_3D_TEXT_LABEL, ActorInfo[idx][actor_3DText], E_STREAMER_WORLD_ID, virtual_world);
Streamer_Update(playerid, STREAMER_TYPE_ACTOR);
Streamer_Update(playerid, STREAMER_TYPE_3D_TEXT_LABEL);
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
DialogInterrupt:dEditActor_VW(playerid)
{
return 1;
}
DialogCreate:dEditActor_Interior(playerid)
{
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#011]. Повторите попытку."); return;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
new dialog_string[8+(42+11)+1+42+1];
format(dialog_string
, sizeof(dialog_string
), "{FFFFFF}\
Текущий интерьер: {00AA00}%d{FFFFFF}\n\
\n\
Укажите новый интерьер в окно ниже:\
", ActorInfo[idx][actor_Interior]);
Dialog_Open(playerid, dEditActor_Interior, DIALOG_STYLE_INPUT,
"Редактирование актёра [Интерьер]", dialog_string, "Изменить", "Назад");
}
DialogResponse:dEditActor_Interior(playerid, response, listitem, inputtext[])
{
if(!response)
{
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
new interior;
if(sscanf(inputtext
, "i", interior
)) {
Dialog_Show(playerid, dEditActor_Interior);
return 1;
}
if(!(-1 <= interior <= 256))
{
SendClientMessage(playerid
, 0xAAAAAAFF, "Ошибка: Интерьер не может быть меньше -1 или больше 256!"); Dialog_Show(playerid, dEditActor_Interior);
return 1;
}
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#012]. Повторите попытку."); return 1;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
ActorInfo[idx][actor_Interior] = interior;
UpdateActorData(idx, actor_Interior);
Streamer_SetIntData(STREAMER_TYPE_ACTOR, idx, E_STREAMER_INTERIOR_ID, interior);
Streamer_SetIntData(STREAMER_TYPE_3D_TEXT_LABEL, ActorInfo[idx][actor_3DText], E_STREAMER_INTERIOR_ID, interior);
Streamer_Update(playerid, STREAMER_TYPE_ACTOR);
Streamer_Update(playerid, STREAMER_TYPE_3D_TEXT_LABEL);
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
DialogInterrupt:dEditActor_Interior(playerid)
{
return 1;
}
DialogCreate:dEditActor_Delete(playerid)
{
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#013]. Повторите попытку."); return;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
new dialog_string[8+(24+MAX_ACTOR_NAME)+1+48+1];
format(dialog_string
, sizeof(dialog_string
), "{FFFFFF}\
Актёр: {00AA00}%s{FFFFFF}\n\
\n\
Вы действительно желаете удалить данного актёра?\
",
ActorInfo[idx][actor_Name]);
Dialog_Open(playerid, dEditActor_Delete, DIALOG_STYLE_MSGBOX,
"Удаление актёра", dialog_string, "Удалить", "Назад");
}
DialogResponse:dEditActor_Delete(playerid, response, listitem, inputtext[])
{
if(!response)
{
Dialog_Show(playerid, dEditActor_Main);
return 1;
}
{
SendClientMessage(playerid
, 0xAAAAAAFF, "При редактировании актёра произошла ошибка [#014]. Повторите попытку."); return 1;
}
new idx
= GetPVarInt(playerid
, pVar__EditActor_ID
);
Iter_Remove(iActors, idx);
DestroyDynamicActor(idx);
DestroyDynamic3DTextLabel(ActorInfo[idx][actor_3DText]);
new query_string[34+11+1];
format(query_string
, sizeof(query_string
), "DELETE FROM actor_list WHERE id = %d", ActorInfo[idx][actor_TableID]);
mysql_tquery(ACTOR_DB_HANDLE, query_string);
return 1;
}
DialogInterrupt:dEditActor_Delete(playerid)
{
return 1;
}