Участник
Пользователь
- Сообщения
- 775
- Реакции
- 293
- Помог
- 11 раз(а)
Доброго времени суток.
Интересует такой вопрос, каким образом можно переписать строку файла по ключу.
Допустим есть плагин, которому на 1 карте, нужна только одна точка для создания. Ради одной точки создавать файлик, не целесообразно.
Так, что к примеру фалик назовем
Ключом для координат, будем использовать название карты.
В итоге у нас получится файлик вида
Сделать одну запись на карте у меня вышло, а вот куда идти чтобы если мне забожалось переписать эту точку, я понять не могу.
Т.е. я захожу на инферно и переписываю точку.
P.S. пока ковырялся схлопотал ошибку
Странно, ведь на 151 и 152 строке, id юзверя работает как нужно.
Пока могу пользоваться менюшкой, только при создании точки в первый раз.
А именно, захожу на карту, ну допустим de_nuke и создаю точку, следом перехожу на другую точку и жму клавишу создания точки.
Срабатывает нахождение по ключу, что говорит нам, о том что точка для карты уже существует и выскакивает меню
Где говорится, о том что точка у нас уже есть и точно ли мы хотим ее перезаписать
1. Да
2. Нет
0. Выход
Если же я жму 1, у меня меню просто закроется, я вызову его еще раз и так до бесконечности.
Если же я нажму 2, У меня снимается блокировка на запись точки и теперь после нажатия заветной кнопки я просто создаю далее кучу точек для этой карты,
А именно получаем файлик вида:
Перезашел на карту, меню теперь сыпет ошибки. (Может потому как я не убил его в конце карты)
Знатоки взываю к вам, я сломал себе уже всю голову, Да и глаз уже замылен, туплю
P.s. Понял что значение булевых в меню нужно поменять, с остальным пока не разберусь
Интересует такой вопрос, каким образом можно переписать строку файла по ключу.
Допустим есть плагин, которому на 1 карте, нужна только одна точка для создания. Ради одной точки создавать файлик, не целесообразно.
Так, что к примеру фалик назовем
spawn.ini
Ключом для координат, будем использовать название карты.
В итоге у нас получится файлик вида
Код:
# <Map Name> <Position X Y Z> <Angles X Y Z>
[de_dust2] -576.3 2146.5 -91.9 -5.3 176.3 0.0
[de_inferno] 2276.1 1952.2 116.0 -1.6 -130.6 0.0
[$2000$] -1031.0 1400.0 -143.9 0.0 -90.0 0.0
Т.е. я захожу на инферно и переписываю точку.
P.S. пока ковырялся схлопотал ошибку
Код:
L 06/28/2022 - 08:26:21: Invalid menu id 0(0)
L 06/28/2022 - 08:26:21: [AMXX] Displaying debug trace (plugin "scoord.amxx", version "1.0")
L 06/28/2022 - 08:26:21: [AMXX] Run time error 10: native error (native "menu_display")
L 06/28/2022 - 08:26:21: [AMXX] [0] scoord.sma::SaveCoord (line 142)
Пока могу пользоваться менюшкой, только при создании точки в первый раз.
А именно, захожу на карту, ну допустим de_nuke и создаю точку, следом перехожу на другую точку и жму клавишу создания точки.
Срабатывает нахождение по ключу, что говорит нам, о том что точка для карты уже существует и выскакивает меню
Где говорится, о том что точка у нас уже есть и точно ли мы хотим ее перезаписать
1. Да
2. Нет
0. Выход
Если же я жму 1, у меня меню просто закроется, я вызову его еще раз и так до бесконечности.
Если же я нажму 2, У меня снимается блокировка на запись точки и теперь после нажатия заветной кнопки я просто создаю далее кучу точек для этой карты,
А именно получаем файлик вида:
Код:
[de_dust2] -576.3 2146.5 -91.9 -5.3 176.3 0.0
[de_inferno] 2276.1 1952.2 116.0 -1.6 -130.6 0.0
[$2000$] -1031.0 1400.0 -143.9 0.0 -90.0 0.0
[de_nuke] 3296.2 -645.5 -315.9 0.0 180.0 0.0
[de_nuke] 2537.2 -476.7 -315.9 0.0 180.0 0.0
[de_nuke] 2487.2 -476.5 -315.9 0.0 180.0 0.0
[de_nuke] 2445.4 -476.4 -315.9 0.0 180.0 0.0
[de_nuke] 2403.7 -476.4 -315.9 0.0 180.0 0.0
[de_nuke] 2366.2 -476.3 -315.9 0.0 180.0 0.0
[de_nuke] 2032.9 -476.3 -315.9 0.0 180.0 0.0
[de_nuke] 1832.9 -476.3 -315.9 0.0 180.0 0.0
[de_nuke] 1687.2 -476.3 -315.9 0.0 180.0 0.0
[de_nuke] 1570.4 -476.3 -354.0 0.0 180.0 0.0
[de_nuke] 1487.2 -476.3 -379.9 0.0 180.0 0.0
[de_nuke] 1424.7 -476.3 -379.9 0.0 180.0 0.0
[de_nuke] 1378.7 -476.3 -379.9 0.0 180.0 0.0
[de_nuke] 1328.9 -476.3 -379.9 0.0 180.0 0.0
Знатоки взываю к вам, я сломал себе уже всю голову, Да и глаз уже замылен, туплю
Код:
#include <amxmodx>
#include <reapi>
#define PLUGIN "Saving coordinates"
#define VERSION "1.0"
#define AUTHOR "maFFyoZZyk"
#define MAX_COORDINATES 3
new const FOLDER_NAME[] = "spawns"; // Папка в которой хранятся файлы с настройками для карт (Название файла будет идентично)
new const FILE_FORMAT[] = "ini"; // Формат файлов
new g_iMenu;
new bool: g_bExists = false;
new Float: g_fOrigin[MAX_COORDINATES], Float: g_fAngles[MAX_COORDINATES];
new g_szFileName[MAX_PLAYERS*2], g_szMapName[MAX_PLAYERS];
public plugin_init ()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("nightvision", "SaveCoord", ADMIN_RCON, "Save coordinatesd"); // Сохраняем координаты.
}
public plugin_cfg()
{
get_log_path();
rh_get_mapname(g_szMapName, charsmax(g_szMapName));
log_to_file(g_szFileName, "Мы на карте %s", g_szMapName);
new szPath[64], szLoadedConfig[96];
get_localinfo("amxx_configsdir", szPath, charsmax(szPath));
formatex(szLoadedConfig, charsmax(szLoadedConfig), "%s/%s/%s.%s", szPath, FOLDER_NAME, FOLDER_NAME, FILE_FORMAT);
new szFilePointer = fopen(szLoadedConfig, "rt");
if(szFilePointer)
{
new szBuffer[128], szMapName[32];
new szArgPosX[8], szArgPosY[8], szArgPosZ[8];
new szArgAngX[8], szArgAngY[8], szArgAngZ[8];
while(!feof(szFilePointer))
{
fgets(szFilePointer, szBuffer, charsmax(szBuffer));
trim(szBuffer);
if(!(szBuffer[0]) || szBuffer[0] == ';' || szBuffer[0] == '#')
continue;
parse(szBuffer, szMapName, charsmax(szMapName),
szArgPosX, charsmax(szArgPosX), szArgPosY, charsmax(szArgPosY), szArgPosZ, charsmax(szArgPosZ),
szArgAngX, charsmax(szArgAngX), szArgAngY, charsmax(szArgAngY), szArgAngZ, charsmax(szArgAngZ)
);
if (contain(szBuffer, g_szMapName) != -1)
{
g_fOrigin[0] = str_to_float(szArgPosX);
g_fOrigin[1] = str_to_float(szArgPosY);
g_fOrigin[2] = str_to_float(szArgPosZ);
g_fAngles[0] = str_to_float(szArgAngX);// + 5.0;
g_fAngles[1] = str_to_float(szArgAngY);
g_fAngles[2] = str_to_float(szArgAngZ);
log_to_file(g_szFileName, "Считываем координаты на карте %s: X:%.1f | Y:%.1f | Z:%.1f", g_szMapName, g_fOrigin[0], g_fOrigin[1], g_fOrigin[2]);
log_to_file(g_szFileName, "Считываем углы точки на карте %s: X:%.1f | Y:%.1f | Z:%.1f", g_szMapName, g_fAngles[0], g_fAngles[1], g_fAngles[2]);
return;
}
}
fclose(szFilePointer);
}
static szTitle[75], szKeyYes[75], szKeyNo[75], szKeyExit[75];
formatex(szTitle, charsmax(szTitle), "%L", LANG_PLAYER, "MENU_TITLE");
formatex(szKeyYes, charsmax(szKeyYes), "%L", LANG_PLAYER, "MENU_KEY_YES");
formatex(szKeyNo, charsmax(szKeyNo), "%L", LANG_PLAYER, "MENU_KEY_NO");
formatex(szKeyExit, charsmax(szKeyNo), "%L", LANG_PLAYER, "MENU_KEY_EXIT");
new g_iMenu = menu_create(szTitle, "MenuHandler");
menu_additem(g_iMenu, szKeyYes);
menu_additem(g_iMenu, szKeyNo);
menu_setprop(g_iMenu, MPROP_EXITNAME, szKeyExit);
menu_setprop(g_iMenu, MPROP_EXIT, MEXIT_ALL);
}
public SaveCoord(id, level)
{
if(!is_user_alive(id))
return PLUGIN_CONTINUE;
if(~get_user_flags(id) & level)
{
client_print(id, print_notify, "* Недостаточно прав для использования этой команды!");
return PLUGIN_HANDLED;
}
new szFileDir[128], szBuffer[128];
get_localinfo("amxx_configsdir", szFileDir, charsmax(szFileDir));
formatex(szFileDir, charsmax(szFileDir), "%s/%s/", szFileDir,FOLDER_NAME);
if(!dir_exists(szFileDir))
{
mkdir(szFileDir);
log_to_file(g_szFileName, "Каталог [%s] - отсутсвует. Создаю новый", FOLDER_NAME);
}
formatex(szFileDir, charsmax(szFileDir), "%s/%s.%s", szFileDir, FOLDER_NAME, FILE_FORMAT);
new szFilePointer = fopen(szFileDir, "rt");
if(!szFilePointer)
{
formatex(szBuffer, charsmax(szBuffer), "\
# File was created for %s.amxx^n\
# Autor %s | Version number %s^n\
# <Map Name> <Position X Y Z> <Angles X Y Z>^n\
^n",
PLUGIN, AUTHOR, VERSION
);
write_file(szFileDir, szBuffer);
log_to_file(g_szFileName, "Файл [%s.%s] - отсутсвует. Создаю новый", FOLDER_NAME, FILE_FORMAT);
}
else
{
while (!feof(szFilePointer))
{
fgets(szFilePointer, szBuffer, sizeof(szBuffer) - 1)
if(!szBuffer[0])
continue;
if (contain(szBuffer, g_szMapName) != -1)
{
log_to_file(g_szFileName, "Запись по карте [%s] - уже существует", g_szMapName);
if(!g_bExists)
{
menu_display(id, g_iMenu, 0);
log_to_file(g_szFileName, "Сделана перезапись координат на карте [%s]", g_szMapName);
return PLUGIN_CONTINUE;
}
}
}
// TODO: условие на уже существование данной строки
new Float: fOrigin[MAX_COORDINATES], Float: fAngles[MAX_COORDINATES];
get_entvar(id, var_origin, fOrigin);
get_entvar(id, var_angles, fAngles);
formatex(szBuffer, charsmax(szBuffer), "[%s] %.1f %.1f %.1f %.1f %.1f %.1f",
g_szMapName, fOrigin[0], fOrigin[1], fOrigin[2],
fAngles[0], fAngles[1], fAngles[2]
);
log_to_file(g_szFileName,
"Добавлена точка на карте [%s] с координатами X:%.1f | Y:%.1f | Z:%.1f",
g_szMapName, fOrigin[0], fOrigin[1], fOrigin[2]
);
log_to_file(g_szFileName,
"Добавлены углы точки на карте [%s] с координатами X:%.1f | Y:%.1f | Z:%.1f",
g_szMapName, fAngles[0], fAngles[1], fAngles[2]
);
write_file(szFileDir, szBuffer);
}
return PLUGIN_CONTINUE;
}
public MenuHandler(id, menu, item)
{
if (item == MENU_EXIT) {
return PLUGIN_CONTINUE;
}
switch (item)
{
case 0:
{
g_bExists = false;
log_to_file(g_szFileName, "Администратор сделал перезапись координат");
}
case 1:
{
g_bExists = true;
log_to_file(g_szFileName, "В перезаписи координат отказано Администратором");
}
}
return PLUGIN_HANDLED;
}
get_log_path()
{
new logsDir[64], DirName[64];
get_localinfo("amxx_logs", logsDir, charsmax(logsDir));
formatex(DirName, charsmax(DirName), "/%s", PLUGIN);
add(logsDir, charsmax(logsDir), DirName);
if(!dir_exists(logsDir))
mkdir(logsDir);
new logDate[24];
get_time("%d%m%Y", logDate, charsmax(logDate));
formatex(g_szFileName, charsmax(g_szFileName), "%s/%s.log", logsDir, logDate);
}
Вложения
-
6.7 KB Просмотры: 3