new Array:g_aPet[2]; // Файлы
new g_aSize[FLY_PET_SETTINGS]; // Настройки
new g_PetUserSett[33][FLY_PET_SETTINGS]; // Настройки питомца
new g_PlayerPageMenu[33], g_SettingsMenu[33]; // Меню
new g_szPlayerSteam[33][34], g_szQuery[512];
new Handle:g_SqlTuple, Handle:g_SqlConnection;
new g_szSaveSqlPassword[32];
new g_szSaveSqlDataBase[32];
new g_szSaveSqlTable[32];
register_plugin("[ALL] Back fly costume's", "b1.0", "XxXx#xXxX");
register_clcmd("pets", "Show_PetMenu");
register_menucmd(register_menuid("Show_PetMenu"), 1023, "Handle_PetMenu");
register_menucmd(register_menuid("Show_SettingsPetMenu"), 1023, "Handle_SettingsPetMenu");
register_dictionary("rcpl/zp_all_info.txt");
register_dictionary("rcpl/zp_main_menu.txt");
g_iPetEntity = ArrayCreate();
new g_iFile[64] = "addons/amxmodx/configs/rcpl/RC_Engine.ini";
new iFile = fopen(g_iFile, "rt");
if(!file_exists(g_iFile))
formatex(szError, charsmax(szError), "[RC] Отсутсвтует: %s", iFile);
new szBuffer[512], szKey[128], szValue[128], szTemp[4][64], iSection;
new aDataModelPet[DATA_FLY_PET], aDataLightPet[DATA_FLY_PET], szFlag[4];
for(new i; i < FLY_PET_SETTINGS; i++)
g_aPet[i] = ArrayCreate(DATA_FLY_PET);
fgets(iFile, szBuffer, charsmax(szBuffer));
replace(szBuffer, charsmax(szBuffer), "^n", "");
if(szBuffer[0] == EOS || szBuffer[0] == '/' && szBuffer[1] == '/' || szBuffer[0] == ';' || szBuffer[0] == '{' || szBuffer[0] == '}' || szBuffer[0] == '#')
parse(szBuffer, szKey, charsmax(szKey), szValue, charsmax(szValue));
trim(szKey), trim(szValue);
if(equal(szKey, "HOST")) copy(g_szSaveSqlHost, charsmax(g_szSaveSqlHost), szValue);
if(equal(szKey, "USER")) copy(g_szSaveSqlUser, charsmax(g_szSaveSqlUser), szValue);
if(equal(szKey, "PASSWORD")) copy(g_szSaveSqlPassword, charsmax(g_szSaveSqlPassword), szValue);
if(equal(szKey, "DATABASE")) copy(g_szSaveSqlDataBase, charsmax(g_szSaveSqlDataBase), szValue);
if(equal(szKey, "TABLE_PETS")) copy(g_szSaveSqlTable, charsmax(g_szSaveSqlTable), szValue);
aDataModelPet[NAME], charsmax(aDataModelPet[NAME]), \
aDataModelPet[FILE], charsmax(aDataModelPet[FILE]), \
szTemp[0], charsmax(szTemp[]), \
szTemp[1], charsmax(szTemp[]), \
szFlag, charsmax(szFlag)\
aDataModelPet[FILE] = engfunc(EngFunc_PrecacheModel, aDataModelPet[FILE]);
if(aDataModelPet[BODY]) aDataModelPet[BODY] = str_to_num(szTemp[0]);
if(aDataModelPet[SKIN]) aDataModelPet[SKIN] = str_to_num(szTemp[1]);
aDataModelPet[FLAG] = read_flags(szFlag);
ArrayPushArray(g_aPet[0], aDataModelPet);
aDataLightPet[NAME], charsmax(aDataLightPet[NAME]), \
szValue, charsmax(szValue), \
szFlag, charsmax(szFlag)\
for(new i; i < 3 && szValue[0] != 0 && strtok(szValue, szValueFile, charsmax(szValueFile), szValue, charsmax(szValue), ','); i++)
trim(szValue), trim(szValueFile);
aDataLightPet[FLY_LIGHT_MODEL][i] = str_to_num(szValueFile);
aDataLightPet[FLAG] = read_flags(szFlag);
ArrayPushArray(g_aPet[1], aDataLightPet);
for(new i; i < FLY_PET_SETTINGS; i++)
g_aSize[i] = ArraySize(g_aPet[i]);
public client_putinserver(id)
new iParams[1]; iParams[0] = id;
get_user_authid(id, g_szPlayerSteam[id], charsmax(g_szPlayerSteam[]));
formatex(g_szQuery, charsmax(g_szQuery), "SELECT * FROM `%s` WHERE (`%s`.`STEAM_ID` = '%s')", g_szSaveSqlTable, g_szSaveSqlTable, g_szPlayerSteam[id]);
SQL_ThreadQuery(g_SqlTuple, "SQL_QueryConnection", g_szQuery, iParams, sizeof iParams);
public client_disconnected(id)
formatex(g_szQuery, charsmax(g_szQuery), "UPDATE `%s` SET \
`FLY_MODEL` = '%d', `FLY_LIGHT` = '%d';", \
g_PetUserSett[id][FLY_MODEL], g_PetUserSett[id][FLY_LIGHT], \
g_szSaveSqlTable, g_szPlayerSteam[id]\
SQL_ThreadQuery(g_SqlTuple, "ThreadQueryHandler", g_szQuery);
g_szPlayerSteam[id] = "";
iSet_Model_Fly_Pet(id, false);
new iErrorCode, szText[512];
g_SqlTuple = SQL_MakeDbTuple(g_szSaveSqlHost, g_szSaveSqlUser, g_szSaveSqlPassword, g_szSaveSqlDataBase);
g_SqlConnection = SQL_Connect(g_SqlTuple, iErrorCode, szText, charsmax(szText));
format(g_szQuery, charsmax(g_szQuery), "CREATE TABLE IF NOT EXISTS `%s` (`STEAM_ID` varchar(34) CHARACTER SET cp1250 COLLATE cp1250_general_ci NOT NULL, \
`FLY_MODEL` INT NOT NULL, `FLY_LIGHT` INT NOT NULL)", g_szSaveSqlTable\
hQueries = SQL_PrepareQuery(g_SqlConnection, g_szQuery);
if(!SQL_Execute(hQueries))
SQL_QueryError(hQueries, szText, charsmax(szText));
SQL_FreeHandle(hQueries);
SQL_FreeHandle(g_SqlTuple);
SQL_FreeHandle(g_SqlConnection);
public SQL_QueryConnection(iState, Handle:hQuery, const szError[], iErrorCode, const szData[], iDataSize)
if(iState == TQUERY_CONNECT_FAILED || iState == TQUERY_QUERY_FAILED)
log_amx("[SERVER] MySQL connection failed");
log_amx("[SERVER] ERROR %d | %s", iErrorCode, szError);
if(iDataSize) log_amx("Query state: %d", szData[iState == TQUERY_CONNECT_FAILED ? 0 : 1]);
if(SQL_NumResults(hQuery) < 1)
if(equal(g_szPlayerSteam[id], "ID_PENDING"))
for(new i; i < FLY_PET_SETTINGS; i++)
g_PetUserSett[id][i] = 0;
format(g_szQuery, charsmax(g_szQuery), "INSERT INTO `%s` (`STEAM_ID`, \
`FLY_MODEL`, `FLY_LIGHT` \
) VALUES ('%s', '0', '0');", g_szSaveSqlTable, g_szPlayerSteam[id]);
SQL_ThreadQuery(g_SqlTuple, "ThreadQueryHandler", g_szQuery);
new const szDataSave[][] = { "FLY_MODEL", "FLY_LIGHT" };
for(new i, iNum; i < FLY_PET_SETTINGS; i++)
iNum = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, szDataSave[i]));
g_PetUserSett[id][i] = (iNum <= g_aSize[i]) ? iNum : 0;
new aDataModelPlayer[DATA_FLY_PET];
ArrayGetArray(g_aPet[0], g_PetUserSett[id][FLY_MODEL], aDataModelPlayer);
if(aDataModelPlayer[FILE])
iSet_Model_Fly_Pet(id, true);
public ThreadQueryHandler(iState, Handle: hQuery, szError[], iErrorCode, iParams[], iParamsSize)
log_amx("SQL Error: %d (%s)", iErrorCode, szError);
new szMenu[512], iKeys = (1<<0|1<<1|1<<8|1<<9), iLen, aData[FLY_PET_SETTINGS][DATA_FLY_PET];
for(new i; i < FLY_PET_SETTINGS; i++)
ArrayGetArray(g_aPet[i], g_PetUserSett[id][i], aData[i]);
iLen = formatex(szMenu, charsmax(szMenu), "%L %L^n^n", id, "RC_MENU_PREFIX", id, "RC_SET_PETS");
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L %L^n", id, "RC_PARENTHESES_1", id, "RC_MENU_MODEL", aData[FLY_MODEL][NAME]);
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L %L^n", id, "RC_PARENTHESES_2", id, "RC_MENU_LIGHT", aData[FLY_LIGHT][NAME]);
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n%L %L", id, "RC_PARENTHESES_9", id, "RC_BACK");
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n%L %L", id, "RC_PARENTHESES_0", id, "RC_EXIT");
return show_menu(id, iKeys, szMenu, -1, "Show_PetMenu");
public Handle_PetMenu(id, iKey)
client_cmd(id, "settings")
case 9: return PLUGIN_HANDLED;
g_SettingsMenu[id] = iKey;
return Clcmd_SettingsPetMenu(id);
public Clcmd_SettingsPetMenu(id) return Show_SettingsPetMenu(id, g_SettingsMenu[id], g_PlayerPageMenu[id] = 0);
Show_SettingsPetMenu(id, iType, iPos)
if(iPos < 0) return Show_PetMenu(id);
new const g_szMenuPetSetting[][] =
"RC_MENU_SETTINGS_MODEL",
new iStart = iPos * NUM_ITEM_PAGE, iListSize;
if(g_aSize[iType] <= NUM_ITEM_PAGE) iListSize = g_aSize[iType] - 1;
else iListSize = g_aSize[iType];
if(iStart > iListSize) iStart = iListSize;
iStart = iStart - (iStart % NUM_ITEM_PAGE);
g_PlayerPageMenu[id] = iStart / NUM_ITEM_PAGE;
new iEnd = iStart + NUM_ITEM_PAGE;
if(iEnd > iListSize) iEnd = iListSize + (iPos ? 0 : 1);
new szMenu[512], iLen, iPagesNum = (iListSize / NUM_ITEM_PAGE + ((iListSize % NUM_ITEM_PAGE) ? 1 : 0));
iLen = formatex(szMenu, charsmax(szMenu), "%L^n^n", id, g_szMenuPetSetting[iType], iPos + 1, iPagesNum);
new iKeys = (1<<7|1<<9), b, aData[DATA_FLY_PET];
for(new a = iStart; a < iEnd; a++)
ArrayGetArray(g_aPet[iType], a, aData);
if(~get_user_flags(id) & aData[FLAG])
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L %L^n", id, "RC_PARENTHESES_INVALID", id, "RC_MENU_NO_FLAGS", aData[NAME]);
else if(g_PetUserSett[id][iType] == a)
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L %s\y*^n", id, "RC_SELECTED", aData[NAME]);
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L %s^n", id, "RC_PARENTHESES", ++b, aData[NAME]);
for(new i = b; i < NUM_ITEM_PAGE; i++) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n");
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n%L %L", id, "RC_PARENTHESES_8", id, "RC_BACK");
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n%L %L", id, "RC_PARENTHESES_9", id, "RC_NEXT");
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n%L %L", id, "RC_PARENTHESES_INVALID", id, "RC_NEXT");
formatex(szMenu[iLen], charsmax(szMenu) - iLen,"^n%L %L", id, "RC_PARENTHESES_0", id, "RC_EXIT");
return show_menu(id, iKeys, szMenu, -1, "Show_SettingsPetMenu");
public Handle_SettingsPetMenu(id, iKey)
case 7: return Show_SettingsPetMenu(id, g_SettingsMenu[id], --g_PlayerPageMenu[id]);
case 8: return Show_SettingsPetMenu(id, g_SettingsMenu[id], ++g_PlayerPageMenu[id]);
case 9: return PLUGIN_HANDLED;
new iCoice = g_PlayerPageMenu[id] * NUM_ITEM_PAGE + iKey;
g_PetUserSett[id][g_SettingsMenu[id]] = iCoice;
iSet_Model_Fly_Pet(id, false);
new aDataModelPlayer[DATA_FLY_PET];
ArrayGetArray(g_aPet[0], g_PetUserSett[id][FLY_MODEL], aDataModelPlayer);
if(aDataModelPlayer[FILE])
iSet_Model_Fly_Pet(id, true);
return Show_SettingsPetMenu(id, g_SettingsMenu[id], g_PlayerPageMenu[id]);
iSet_Model_Fly_Pet(pId, bool:bUsed)
iEntity[pId] = rg_create_entity("info_target");
if(is_entity(iEntity[pId]))
new aDataModelPlayer[DATA_FLY_PET];
ArrayGetArray(g_aPet[0], g_PetUserSett[pId][FLY_MODEL], aDataModelPlayer);
if(aDataModelPlayer[FILE])
set_entvar(iEntity[pId], var_modelindex, aDataModelPlayer[FILE]);
//engfunc(EngFunc_SetModel, iEntity[pId], aDataModelPlayer[FILE]);
set_entvar(iEntity[pId], var_aiment, pId);
set_entvar(iEntity[pId], var_movetype, MOVETYPE_FOLLOW);
if(aDataModelPlayer[BODY]) set_entvar(iEntity[pId], var_body, aDataModelPlayer[BODY]);
if(aDataModelPlayer[SKIN]) set_entvar(iEntity[pId], var_skin, aDataModelPlayer[SKIN]);
new aDataLightPet[DATA_FLY_PET];
ArrayGetArray(g_aPet[1], g_PetUserSett[pId][FLY_LIGHT], aDataLightPet);
if(aDataLightPet[FLY_LIGHT_MODEL][0] != 0 || aDataLightPet[FLY_LIGHT_MODEL][1] != 0 || aDataLightPet[FLY_LIGHT_MODEL][2] != 0)
vecColor[0] = float(aDataLightPet[FLY_LIGHT_MODEL][0]);
vecColor[1] = float(aDataLightPet[FLY_LIGHT_MODEL][1]);
vecColor[2] = float(aDataLightPet[FLY_LIGHT_MODEL][2]);
// rg_set_user_rendering(pId, kRenderFxGlowShell, vecColor, kRenderNormal, 0.0);
if(aDataModelPlayer[FILE])
rg_set_user_rendering(iEntity[pId], kRenderFxGlowShell, vecColor, kRenderNormal, 5.0);
// set_entvar(iEntity[pId], var_body, str_to_num(aDataCostumes[SUB_MODEL]));
set_entvar(iEntity[pId], var_sequence, 0);
set_entvar(iEntity[pId], var_animtime, get_gametime());
set_entvar(iEntity[pId], var_framerate, 1.0);
set_entvar(iEntity[pId], var_iuser1, pId);
ArrayPushCell(g_iPetEntity, iEntity[pId]);
for(new i = 0; i < ArraySize(g_iPetEntity); i++)
iEntity = ArrayGetCell(g_iPetEntity, i);
if(get_entvar(iEntity, var_iuser1) == pId)
if(iEntity) rg_remove_entity(iEntity);
ArrayDeleteItem(g_iPetEntity, i);
stock rg_remove_entity(const id)
set_entvar(id, var_flags, get_entvar(id, var_flags) | FL_KILLME);
set_entvar(id, var_nextthink, get_gametime());
stock rg_set_user_rendering(id, fx = kRenderFxNone, {Float,_}:color[3] = {0.0, 0.0, 0.0}, render = kRenderNormal, Float:amount = 0.0)
set_entvar(id, var_renderfx, fx);
set_entvar(id, var_rendercolor, color);
set_entvar(id, var_rendermode, render);
set_entvar(id, var_renderamt, amount);