Буффер (размерность) для массивов под класснеймы, модели и координаты.
При необходимости увеличить, например если у Вас будет длинное название перемещаемой модели. (то 64 может не хватить)
CLASSNAME_ARRAY_BUFFER = 32,
COORDINATE_ARRAY_BUFFER = 66
new const PLUGIN_VER[] = "1.1.0";
new const PLUGIN_DIR[] = "move_entities";
new const AXES_OF_MOVEMENT[][] =
new Float:Move[MAX_PLAYERS+1], Sign[MAX_PLAYERS+1], CheckCoords[MAX_PLAYERS+1];
new Path[MAX_RESOURCE_PATH_LENGTH * 2], Map[MAX_MAPNAME_LENGTH], SaveValue[MAX_PLAYERS+1];
register_plugin("Move entities", PLUGIN_VER, "wellasgood");
register_dictionary("move_entities.txt");
while(i < sizeof COMMANDS)
register_clcmd(COMMANDS[i++], "@MoveMenu");
register_menu("@MoveMenu", 1023, "@Handle_MoveMenu", 0);
register_concmd("MoveValue", "@MoveHandler");
register_cvar("move_entities_version", PLUGIN_VER, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED);
get_localinfo("amxx_configsdir", Path, charsmax(Path));
if(!dir_exists(fmt("%s/%s", Path, PLUGIN_DIR)))
mkdir(fmt("%s/%s", Path, PLUGIN_DIR));
get_mapname(Map, charsmax(Map));
formatex(Path, charsmax(Path), "%s/%s/ent_coords_%s.cfg", Path, PLUGIN_DIR, Map);
if(~get_user_flags(id) & ACCESS) return 0;
new Menu[MAX_MENU_LENGTH], Keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_0;
new Len = formatex(Menu, charsmax(Menu), "%L^n^n", id, "MOVE_ENT_MENU_TITLE");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[1] \y# \w%L: \r[\y%L\r]^n", id, "MOVE_ENT_MENU_ITEM1", id, fmt("MOVE_ENT_MENU_ITEM1_%d", Sign[id]));
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[2] \y# \w%L\w: \r[\y%.2f\r]^n^n", id, "MOVE_ENT_MENU_ITEM2", Move[id]);
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[3] \y# \w%L\w: \r[\y%L\r]^n^n", id, "MOVE_ENT_MENU_ITEM3", id, fmt("MOVE_ENT_MENU_ITEM3_%d", SaveValue[id]));
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[4] \y# \w%L: \r[\y%s\r]^n^n", id, "MOVE_ENT_MENU_ITEM4_TITLE", AXES_OF_MOVEMENT[CheckCoords[id]]);
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[5] \y# \w%L^n^n", id, "MOVE_ENT_MENU_ITEM5");
formatex(Menu[Len], charsmax(Menu) - Len, "\r[0] \y# \w%L", id, "MENU_EXIT");
return show_menu(id, Keys, Menu, -1, "@MoveMenu");
@Handle_MoveMenu(id, Keys)
Sign[id] = (Sign[id] + 1) % 2;
client_cmd(id, "messagemode ^"MoveValue^"");
SaveValue[id] = (SaveValue[id] + 1) % 2;
CheckCoords[id] = (CheckCoords[id] + 1) % sizeof AXES_OF_MOVEMENT;
MoveEntity(id, CheckCoords[id]);
if(~get_user_flags(id) & ACCESS) return;
read_argv(1, String, charsmax(String));
strtok(String, Part1, charsmax(Part1), Part2, charsmax(Part2), '.');
if(is_str_num(Part1) && is_str_num(Part2))
Move[id] = str_to_float(String);
MoveEntity(id, mode, ent = 0)
get_user_aiming(id, ent, _, 9999);
get_entvar(ent, Sign[id] == 1 ? var_origin : var_angles, DataCoord);
case 0: DataCoord[0] += Move[id];
case 1: DataCoord[0] -= Move[id];
case 2: DataCoord[1] += Move[id];
case 3: DataCoord[1] -= Move[id];
case 4: DataCoord[2] += Move[id];
case 5: DataCoord[2] -= Move[id];
set_entvar(ent, Sign[id] == 1 ? var_origin : var_angles, DataCoord);
client_print_color(id, print_team_default, "%l ^1%s ^3X ^4%.2f ^1| ^3Y ^4%.2f ^1| ^3Z ^4%.2f", "MOVE_ENT_CHAT_PREFIX", Sign[id] == 1 ? "Origin:" : "Angles:", DataCoord[0], DataCoord[1], DataCoord[2]);
new Class[CLASSNAME_ARRAY_BUFFER];
get_entvar(ent, var_classname, Class, charsmax(Class));
new model[MODEL_ARRAY_BUFFER];
get_entvar(ent, var_model, model, charsmax(model));
new Float:NewCoords[2][3];
get_entvar(ent, var_angles, NewCoords[0]);
get_entvar(ent, var_origin, NewCoords[1]);
write_file(Path, fmt("%s %s %f %f %f %f %f %f", Class, model, NewCoords[0][0], NewCoords[0][1], NewCoords[0][2], NewCoords[1][0], NewCoords[1][1], NewCoords[1][2]), CheckModelHandler(model));
CheckModelHandler(model[])
new Data[MODEL_ARRAY_BUFFER], f = fopen(Path, "rt"), i;
fgets(f, Data, charsmax(Data));
if(contain(Data, model) != -1)
if(!file_exists(Path)) return;
new f = fopen(Path, "rt");
new Data[CLASSNAME_ARRAY_BUFFER + MODEL_ARRAY_BUFFER + COORDINATE_ARRAY_BUFFER], classname[CLASSNAME_ARRAY_BUFFER];
new model[MODEL_ARRAY_BUFFER], FloatData[6][COORDINATE_ARRAY_BUFFER / 6];
fgets(f, Data, charsmax(Data));
parse(Data, classname, charsmax(classname), model, charsmax(model), FloatData[0], charsmax(FloatData[]), FloatData[1], charsmax(FloatData[]), FloatData[2], charsmax(FloatData[]), FloatData[3], charsmax(FloatData[]), FloatData[4], charsmax(FloatData[]), FloatData[5], charsmax(FloatData[]));
OldAndNewEntityHandler(false, classname, model, fmt("%s %s %s %s %s %s", FloatData[0], FloatData[1], FloatData[2], FloatData[3], FloatData[4], FloatData[5]));
OldAndNewEntityHandler(bool:value, classname[], old_data[], new_data[], ent=0)
for(new ent = rg_find_ent_by_class(NULLENT, classname, equal(old_data[0], "*") ? true : false), model[MODEL_ARRAY_BUFFER], array[2]; ent > 0; ent = rg_find_ent_by_class(ent, classname, equal(old_data[0], "*") ? true : false))
get_entvar(ent, var_model, model, charsmax(model));
if(!equal(model, old_data)) continue;
OldAndNewEntityHandler(true, array[0], array[1], new_data, ent);
new StringCoords[6][COORDINATE_ARRAY_BUFFER / 6], Float:FloatData[2][3];
parse(new_data, StringCoords[0], charsmax(StringCoords[]), StringCoords[1], charsmax(StringCoords[]), StringCoords[2], charsmax(StringCoords[]), StringCoords[3], charsmax(StringCoords[]), StringCoords[4], charsmax(StringCoords[]), StringCoords[5], charsmax(StringCoords[]));
FloatData[0][0] = str_to_float(StringCoords[0]);
FloatData[0][1] = str_to_float(StringCoords[1]);
FloatData[0][2] = str_to_float(StringCoords[2]);
FloatData[1][0] = str_to_float(StringCoords[3]);
FloatData[1][1] = str_to_float(StringCoords[4]);
FloatData[1][2] = str_to_float(StringCoords[5]);
set_entvar(ent, var_angles, FloatData[0]);
set_entvar(ent, var_origin, FloatData[1]);