1 - цветы не удаляются когда игрок подходит и ему выдает или отнимает жизни, запускается таймер до повторного использования;
2 - цветы удаляются и появляются автоматически в том же месте через заданное время в кваре.
Float:FL_ORIGIN[COORD_DATA],
new const PLUGIN[] = "Flower";
new const VERSION[] = "0.0.9";
new const AUTHOR[] = "wellasgood";
new const FLOWER_MENU = ADMIN_RCON; //для доступа к главному меню.
new const FLOWER_DIR[] = "Flower_Save";
new const FLOWER_MDL[] = "models/flower/flower.mdl";
new const FLOWER_MDL[] = "models/flower/flower-new.mdl";
new const FLOWER_SND[] = "flower/flower-snd.wav";
new const Float:FLOWER_MIN[COORD_DATA] =
new const Float:FLOWER_MAX[COORD_DATA] =
new SaveDir[MAX_RESOURCE_PATH_LENGTH], CheckHP[MAX_PLAYERS+1], ValueTime[MAX_PLAYERS+1], ValueHP[MAX_PLAYERS+1];
new MapPath[MAX_RESOURCE_PATH_LENGTH * 2], MapName[MAX_MAPNAME_LENGTH], FL_BUTTON, CheckValue[MAX_PLAYERS+1];
new eGlobalSave[UNIQUE_ID_COUNT][SETTINGS_DATA], GlobalCountEnt, Float:MOVE_VALUE;
new Float:CheckTime[UNIQUE_ID_COUNT][MAX_PLAYERS+1];
new Float:CheckTimeFix[UNIQUE_ID_COUNT][MAX_PLAYERS+1];
new bool:CheckRegen[UNIQUE_ID_COUNT];
register_plugin(PLUGIN, VERSION, AUTHOR);
register_dictionary("flower.txt");
register_clcmd("say /fl-menu", "@OpenMenu");
register_clcmd("say /flower-menu", "@OpenMenu");
register_concmd("HealthAndTimeValue", "@HealthAndTimeHandler");
register_menu("FlowerMenu", 1023, "@Handle_FlowerMenu", 0);
register_menu("MoveMenu", 1023, "@Handle_MoveMenu", 0);
register_forward(FM_Touch, "@fwdTouch_flower");
FL_BUTTON = engfunc(EngFunc_AllocString, "func_button");
bind_pcvar_float(create_cvar(
.description = MULTI_DESC("FL_DESC_MOVE_VALUE")),
AutoExecConfig(true, "Flower");
precache_model(FLOWER_MDL);
precache_sound(FLOWER_SND);
new LocalDir[MAX_RESOURCE_PATH_LENGTH];
get_localinfo("amxx_configsdir", LocalDir, charsmax(LocalDir));
formatex(SaveDir, charsmax(SaveDir), "%s/%s", LocalDir, FLOWER_DIR);
get_mapname(MapName, charsmax(MapName));
formatex(MapPath, charsmax(MapPath), "%s/%s.cfg", SaveDir, MapName);
if(!file_exists(MapPath))
set_task_ex(7.0, "@ReadFlower", 1);
set_task_ex(5.0, "@ReadFlower", 2);
new Data[128], f = fopen(MapPath, "rt"), HP[16], Time[16], i = 1, UniqueID;
new Float:Origin[COORD_DATA], Type[3], Coord_X[13], Coord_Y[13], Coord_Z[13];
fgets(f, Data, charsmax(Data));
parse(Data, Type, charsmax(Type), Coord_X, charsmax(Coord_X), Coord_Y, charsmax(Coord_Y), Coord_Z, charsmax(Coord_Z));
Origin[X] = str_to_float(Coord_X);
Origin[Y] = str_to_float(Coord_Y);
Origin[Z] = str_to_float(Coord_Z);
CreateEntity(0, "Flower+", Origin);
else if(equal(Type, "F-"))
CreateEntity(0, "Flower-", Origin);
parse(Data, Type, charsmax(Type), HP, charsmax(HP), Time, charsmax(Time));
if(equal(Type, "F+") || equal(Type, "F-"))
else if(equal(Type, "S"))
UniqueID = UNIQUE_ID_ENT + i;
eGlobalSave[UniqueID][FL_HEALTH] = str_to_num(HP);
eGlobalSave[UniqueID][FL_TIME] = str_to_num(Time);
if(~get_user_flags(id) & FLOWER_MENU)
new Menu[MAX_MENU_LENGTH], Keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_0;
new Len = formatex(Menu, charsmax(Menu), "%L^n^n", id, "FL_MAIN_MENU_TITLE");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[1] \y# \w%L: \r[\y%L\r]^n", id, "FL_MAIN_MENU_ITEM_1", id, !CheckHP[id] ? "FL_MAIN_MENU_ITEM1_VALUE1" : "FL_MAIN_MENU_ITEM1_VALUE2");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[2] \y# \w%L: \r[\y%d\r]^n", id, "FL_MAIN_MENU_ITEM_2", ValueHP[id]);
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[3] \y# \w%L \d%L: \r[\y%d\r]^n^n", id, "FL_MAIN_MENU_ITEM_3", id, "FL_MAIN_MENU_ITEM3_VALUE1", ValueTime[id]);
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[3] \y# \w%L \d%L: \r[\y%d\r]^n^n", id, "FL_MAIN_MENU_ITEM_3", id, "FL_MAIN_MENU_ITEM3_VALUE2", ValueTime[id]);
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[4] \y# \w%L^n^n", id, "FL_MAIN_MENU_ITEM_4");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[5] \y# \w%L^n", id, "FL_MAIN_MENU_ITEM_5");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[6] \y# \w%L^n", id, "FL_MAIN_MENU_ITEM_6");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[7] \y# \w%L^n", id, "FL_MAIN_MENU_ITEM_7");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[8] \y# \w%L^n^n", id, "FL_MAIN_MENU_ITEM_8");
formatex(Menu[Len], charsmax(Menu) - Len, "\r[0] \y# \w%L", id, "FL_MENU_EXIT");
return show_menu(id, Keys, Menu, -1, "FlowerMenu");
@Handle_FlowerMenu(id, Keys)
CheckHP[id] = (CheckHP[id] + 1) % 2;
client_cmd(id, "messagemode ^"HealthAndTimeValue^"");
client_cmd(id, "messagemode ^"HealthAndTimeValue^"");
CreateEntity(id, !CheckHP[id] ? "Flower+" : "Flower-");
get_user_aiming(id, ent, body, 9999);
pev(ent, pev_classname, Classname, charsmax(Classname));
if(equal(Classname, "Flower+") || equal(Classname, "Flower-"))
set_pev(ent, pev_flags, FL_KILLME);
@HealthAndTimeHandler(id)
read_argv(1, String, charsmax(String));
ValueHP[id] = str_to_num(String);
ValueTime[id] = str_to_num(String);
for(new i = UNIQUE_ID_ENT + 1; i <= GlobalCountEnt + UNIQUE_ID_ENT; i++)
if(!pev_valid(eGlobalSave[i][FL_ENT]))
pev(eGlobalSave[i][FL_ENT], pev_classname, Classname, charsmax(Classname));
formatex(Data, charsmax(Data), !equal(Classname, "Flower+") ? "F- %f %f %f" : "F+ %f %f %f", eGlobalSave[i][FL_ORIGIN][X], eGlobalSave[i][FL_ORIGIN][Y], eGlobalSave[i][FL_ORIGIN][Z]);
formatex(Data, charsmax(Data), "S %d %d", eGlobalSave[i][FL_HEALTH], eGlobalSave[i][FL_TIME]);
write_file(MapPath, Data);
for(new i = UNIQUE_ID_ENT + 1; i <= GlobalCountEnt + UNIQUE_ID_ENT; i++)
if(!pev_valid(eGlobalSave[i][FL_ENT]))
set_pev(eGlobalSave[i][FL_ENT], pev_flags, FL_KILLME);
CreateEntity(id, const Classname[], Float:Origin[COORD_DATA]={0.0, 0.0, 0.0})
new ent = engfunc(EngFunc_CreateNamedEntity, FL_BUTTON);
new UniqueID = UNIQUE_ID_ENT + GlobalCountEnt;
set_pev(ent, pev_classname, Classname);
set_pev(ent, pev_solid, SOLID_BBOX);
set_pev(ent, pev_movetype, MOVETYPE_FLY);
set_pev(ent, pev_target);
set_pev(ent, pev_flower, UniqueID);
engfunc(EngFunc_SetModel, ent, FLOWER_MDL);
engfunc(EngFunc_SetSize, ent, FLOWER_MIN, FLOWER_MAX);
fm_get_aim_origin(id, Origin);
eGlobalSave[UniqueID][FL_HEALTH] = ValueHP[id];
eGlobalSave[UniqueID][FL_TIME] = ValueTime[id];
eGlobalSave[UniqueID][FL_ORIGIN] = Origin;
eGlobalSave[UniqueID][FL_ENT] = ent;
engfunc(EngFunc_SetOrigin, ent, Origin);
set_pev(ent, pev_frame, 0.0);
set_pev(ent, pev_framerate, 0.4);
set_pev(ent, pev_sequence, 0);
set_pev(ent, pev_animtime, get_gametime());
new Menu[MAX_MENU_LENGTH], Keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_0;
new Len = formatex(Menu, charsmax(Menu), "%L^n^n", id, "FL_MOVE_MENU_TITLE");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[1] \y# \wX++^n");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[2] \y# \wX--^n");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[3] \y# \wY++^n");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[4] \y# \wY--^n");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[5] \y# \wZ++^n");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[6] \y# \wZ--^n^n");
formatex(Menu[Len], charsmax(Menu) - Len, "\r[0] \y# \w%L", id, "FL_MENU_BACK");
return show_menu(id, Keys, Menu, -1, "MoveMenu");
@Handle_MoveMenu(id, Keys)
get_user_aiming(id, ent, body, 9999);
pev(ent, pev_classname, Classname, charsmax(Classname));
if(equal(Classname, "Flower+") || equal(Classname, "Flower-"))
new Float:DataCoord[COORD_DATA];
pev(ent, pev_origin, DataCoord);
case 0: DataCoord[X] += MOVE_VALUE;
case 1: DataCoord[X] -= MOVE_VALUE;
case 2: DataCoord[Y] += MOVE_VALUE;
case 3: DataCoord[Y] -= MOVE_VALUE;
case 4: DataCoord[Z] += MOVE_VALUE;
case 5: DataCoord[Z] -= MOVE_VALUE;
engfunc(EngFunc_SetOrigin, ent, DataCoord);
@fwdTouch_flower(ent, id)
pev(ent, pev_classname, Classname, charsmax(Classname));
if(equal(Classname, "Flower+") || equal(Classname, "Flower-"))
for(new i = UNIQUE_ID_ENT + 1; i <= GlobalCountEnt + UNIQUE_ID_ENT; i++)
if(pev(ent, pev_flower) == i)
if(CheckRegen[Temporary_i])
if(equal(Classname, "Flower+"))
if(CheckTime[Temporary_i][id] >= get_gametime())
client_print(id, print_center, "%L", id, "FL_BONUS_TIME_INFO", CheckTime[Temporary_i][id] - get_gametime());
if(eGlobalSave[Temporary_i][FL_TIME] > 0)
CheckTime[Temporary_i][id] = get_gametime() + float(eGlobalSave[Temporary_i][FL_TIME]);
if(CheckTimeFix[Temporary_i][id] >= get_gametime())
CheckTimeFix[Temporary_i][id] = get_gametime() + float(eGlobalSave[Temporary_i][FL_TIME]);
if(!equal(Classname, "Flower+"))
hp = pev(id, pev_health) - float(eGlobalSave[Temporary_i][FL_HEALTH]);
hp = pev(id, pev_health) + float(eGlobalSave[Temporary_i][FL_HEALTH]);
set_pev(id, pev_health, hp);
if(eGlobalSave[Temporary_i][FL_TIME] > 0)
fm_set_entity_visibility(ent, 0);
CheckRegen[Temporary_i] = true;
new num = !equal(Classname, "Flower+") ? 1 : 2;
set_task_ex(float(eGlobalSave[Temporary_i][FL_TIME]), "@RegenerationFlower", num, array, sizeof array);
set_pev(ent, pev_flags, FL_KILLME);
SendAudio(id, FLOWER_SND, PITCH_HIGH);
set_hudmessage(random_num(150, 255), random_num(150, 255), random_num(150, 255), -1.0, -0.50, 0, _, 1.0, _, 1.5, -1);
show_hudmessage(id, "%L", id, !equal(Classname, "Flower+") ? "FL_BONUS_HUD_INFO_MODE1-" : "FL_BONUS_HUD_INFO+", eGlobalSave[Temporary_i][FL_HEALTH]);
show_hudmessage(id, "%L", id, !equal(Classname, "Flower+") ? "FL_BONUS_HUD_INFO_MODE2-" : "FL_BONUS_HUD_INFO+", eGlobalSave[Temporary_i][FL_HEALTH]);
@RegenerationFlower(value[], num)
fm_set_entity_visibility(eGlobalSave[check][FL_ENT], 1);
CheckRegen[check] = false;
stock SendAudio(id, const audio[], pitch)
MsgSendAudio = get_user_msgid("SendAudio");
message_begin(id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, MsgSendAudio, _, id);