new const PLAYER_MODEL[] = "Mushrooms_mario";
new PlayerModel[MAX_PLAYERS+1][64], BitCustomModel;
new const PLUGIN[] = "MagicMushrooms";
new const VERSION[] = "0.0.9";
new const AUTHOR[] = "wellasgood";
new const MUSHROOMS_MENU = ADMIN_RCON; //для доступа к главному меню создания грибов.
new const MUSHROOMS_DIR[] = "Mushrooms";
new const MUSHROOMS_MDL[] = "models/Mushrooms/Mushrooms.mdl";
new const MUSHROOMS_SND[] = "Mushrooms/mushrooms-snd.wav";
new const Float:MUSHROOMS_MIN[COORD_DATA] =
new const Float:MUSHROOMS_MAX[COORD_DATA] =
new const DATA_VALUES[3][] =
new eCvars[CVARS], SaveDir[MAX_RESOURCE_PATH_LENGTH], MapPath[MAX_RESOURCE_PATH_LENGTH * 2], Float:PlayerSpeed[MAX_PLAYERS+1];
new MapName[MAX_MAPNAME_LENGTH], MM_BUTTON, Check[MAX_PLAYERS+1], bool:CheckPlayerUse[ACTION_VALUES][MAX_PLAYERS+1];
register_plugin(PLUGIN, VERSION, AUTHOR);
register_dictionary("Mushrooms.txt");
register_clcmd("say /mr-menu", "@OpenMenu");
register_menu("MushroomsMenu", 1023, "@Handle_MushroomsMenu", 0);
register_menu("MoveMenu", 1023, "@Handle_MoveMenu", 0);
RegisterHam(Ham_CS_Player_ResetMaxSpeed, "player", "@CheckSpeed", 0);
RegisterHam(Ham_Spawn, "player", "@Ham_PlayerSpawn_Post", 1);
register_forward(FM_Touch, "@fwdTouch_Mushrooms");
register_forward(FM_SetClientKeyValue, "@FM_SetClientKeyValue_Pre", 0);
MM_BUTTON = engfunc(EngFunc_AllocString, "func_button");
AutoExecConfig(true, "MagicMushrooms");
precache_model(fmt("models/player/%s/%s.mdl", PLAYER_MODEL, PLAYER_MODEL));
precache_model(MUSHROOMS_MDL);
precache_sound(MUSHROOMS_SND);
new LocalDir[MAX_RESOURCE_PATH_LENGTH];
get_localinfo("amxx_configsdir", LocalDir, charsmax(LocalDir));
formatex(SaveDir, charsmax(SaveDir), "%s/%s", LocalDir, MUSHROOMS_DIR);
get_mapname(MapName, charsmax(MapName));
formatex(MapPath, charsmax(MapPath), "%s/%s.cfg", SaveDir, MapName);
if(!file_exists(MapPath))
public client_disconnected(id)
if(CheckPlayerUse[RANDOM][id])
CheckPlayerUse[RANDOM][id] = false;
if(CheckPlayerUse[POISONOUS][id])
CheckPlayerUse[POISONOUS][id] = false;
if(CheckPlayerUse[HAPPY][id])
BIT_SUB(BitCustomModel, id);
CheckPlayerUse[HAPPY][id] = false;
@Ham_PlayerSpawn_Post(id)
if(CheckPlayerUse[RANDOM][id])
CheckPlayerUse[RANDOM][id] = false;
if(CheckPlayerUse[POISONOUS][id])
CheckPlayerUse[POISONOUS][id] = false;
if(CheckPlayerUse[HAPPY][id])
fm_cs_reset_user_model(id);
CheckPlayerUse[HAPPY][id] = false;
new Data[128], Float:Origin[COORD_DATA], f = fopen(MapPath, "rt"), 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);
if(equal(Type, DATA_VALUES[0]))
CreateEntity(0, "mushrooms_m", Origin);
else if(equal(Type, DATA_VALUES[1]))
CreateEntity(0, "mushrooms_p", Origin);
else if(equal(Type, DATA_VALUES[2]))
CreateEntity(0, "mushrooms_r", Origin);
if(~get_user_flags(id) & MUSHROOMS_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_0;
new Len = formatex(Menu, charsmax(Menu), "%L^n^n", id, "MM_MAIN_MENU_TITLE");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[1] \y# \w%L: \r[\y%L\r]^n", id, "MM_MAIN_MENU_ITEM_1", id, fmt("MM_MAIN_MENU_ITEM1_VALUE%d", Check[id] + 1));
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[2] \y# \w%L^n^n", id, "MM_MAIN_MENU_ITEM_2");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[3] \y# \w%L^n", id, "MM_MAIN_MENU_ITEM_3");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[4] \y# \w%L^n", id, "MM_MAIN_MENU_ITEM_4");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[5] \y# \w%L^n", id, "MM_MAIN_MENU_ITEM_5");
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\r[6] \y# \w%L^n^n", id, "MM_MAIN_MENU_ITEM_6");
formatex(Menu[Len], charsmax(Menu) - Len, "\r[0] \y# \w%L", id, "MM_MENU_EXIT");
return show_menu(id, Keys, Menu, -1, "MushroomsMenu");
@Handle_MushroomsMenu(id, Keys)
Check[id] = (Check[id] + 1) % 3;
case 0: CreateEntity(id, "mushrooms_p");
case 1: CreateEntity(id, "mushrooms_m");
case 2: CreateEntity(id, "mushrooms_r");
SaveAndDeleteHandler("mushrooms_m", 1, 0);
SaveAndDeleteHandler("mushrooms_p", 1, 1);
SaveAndDeleteHandler("mushrooms_r", 1, 2);
get_user_aiming(id, ent, body, 9999);
pev(ent, pev_classname, Classname, charsmax(Classname));
if(equal(Classname, "mushrooms_m") || equal(Classname, "mushrooms_p") || equal(Classname, "mushrooms_r"))
set_pev(ent, pev_flags, FL_KILLME);
SaveAndDeleteHandler("mushrooms_m", 2, 0);
SaveAndDeleteHandler("mushrooms_p", 2, 0);
SaveAndDeleteHandler("mushrooms_r", 2, 0);
SaveAndDeleteHandler(const classname[], num, value)
new Data[128], ent, Float:Origin[COORD_DATA];
while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)))
pev(ent, pev_origin, Origin);
formatex(Data, charsmax(Data), fmt("%s %f %f %f", DATA_VALUES[value], Origin[X], Origin[Y], Origin[Z]));
write_file(MapPath, Data);
set_pev(ent, pev_flags, FL_KILLME);
CreateEntity(id, const Classname[], Float:Origin[COORD_DATA]={0.0, 0.0, 0.0})
new ent = engfunc(EngFunc_CreateNamedEntity, MM_BUTTON);
set_pev(ent, pev_classname, Classname);
set_pev(ent, pev_solid, SOLID_BBOX);
set_pev(ent, pev_movetype, MOVETYPE_NONE);
set_pev(ent, pev_target);
engfunc(EngFunc_SetModel, ent, MUSHROOMS_MDL);
engfunc(EngFunc_SetSize, ent, MUSHROOMS_MIN, MUSHROOMS_MAX);
fm_get_aim_origin(id, Origin);
engfunc(EngFunc_SetOrigin, ent, Origin);
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, "MM_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, "MM_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, "mushrooms_m") || equal(Classname, "mushrooms_p") || equal(Classname, "mushrooms_r"))
new Float:DataCoord[COORD_DATA];
pev(ent, pev_origin, DataCoord);
case 0: DataCoord[X] += eCvars[MM_MOVE_VALUE];
case 1: DataCoord[X] -= eCvars[MM_MOVE_VALUE];
case 2: DataCoord[Y] += eCvars[MM_MOVE_VALUE];
case 3: DataCoord[Y] -= eCvars[MM_MOVE_VALUE];
case 4: DataCoord[Z] += eCvars[MM_MOVE_VALUE];
case 5: DataCoord[Z] -= eCvars[MM_MOVE_VALUE];
engfunc(EngFunc_SetOrigin, ent, DataCoord);
if(CheckPlayerUse[HAPPY][id])
@fwdTouch_Mushrooms(ent, id)
pev(ent, pev_classname, Classname, charsmax(Classname));
if(equal(Classname, "mushrooms_r") && !CheckPlayerUse[RANDOM][id])
arrayset(Classname, 0, charsmax(Classname));
new Num = random_num(0, 1);
formatex(Classname, charsmax(Classname), Num == 0 ? "mushrooms_p" : "mushrooms_m");
CheckPlayerUse[RANDOM][id] = true;
if(CheckPlayerUse[Num][id])
if(equal(Classname, "mushrooms_p") && !CheckPlayerUse[POISONOUS][id] || equal(Classname, "mushrooms_m") && !CheckPlayerUse[HAPPY][id])
if(equal(Classname, "mushrooms_p"))
ScreenShake(id, (1 << 12), (1 << 12), (1 << 12));
if(eCvars[MM_SCREENFADE])
set_task_ex(eCvars[MM_TIME_KILL], "@EventKill", id);
@EventPoisoning(array, id);
if(eCvars[MM_TIME_POISONING] > 0.0)
set_task_ex(eCvars[MM_TIME_POISONING], "@EventPoisoning", id, array, sizeof array);
CheckPlayerUse[POISONOUS][id] = true;
else if(equal(Classname, "mushrooms_m"))
pev(id, pev_maxspeed, PlayerSpeed[id]);
if(eCvars[MM_TIME_HAPPY] > 0.0)
set_task_ex(eCvars[MM_TIME_HAPPY], "@EventHappy", id, array, sizeof array);
CheckPlayerUse[HAPPY][id] = true;
SendAudio(id, MUSHROOMS_SND, PITCH_NORM);
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, "mushrooms_m") ? "MM_HUD_INFO_1" : "MM_HUD_INFO_2");
@EventPoisoning(value[], id)
message_begin(MSG_ONE, get_user_msgid("SetFOV"), { 0, 0, 0 }, id);
write_byte(check == 1 ? 0 : 180);
CheckPlayerUse[POISONOUS][id] = false;
if(CheckPlayerUse[RANDOM][id])
CheckPlayerUse[RANDOM][id] = false;
check == 0 ? fm_cs_set_user_model(id, PLAYER_MODEL) : fm_cs_reset_user_model(id);
CheckPlayerUse[HAPPY][id] = false;
if(CheckPlayerUse[RANDOM][id])
CheckPlayerUse[RANDOM][id] = false;
check == 0 ? set_pev(id, pev_maxspeed, eCvars[MM_BONUS_SPEED]) : set_pev(id, pev_maxspeed, PlayerSpeed[id]);
bind_pcvar_float(create_cvar(
.description = MULTI_DESC("MM_DESC_MOVE_VALUE")),
bind_pcvar_float(create_cvar(
.description = MULTI_DESC("MM_DESC_TIME_KILL")),
bind_pcvar_float(create_cvar(
.name = "mr_bonus_speed",
.description = MULTI_DESC("MM_DESC_BONUS_SPEED")),
bind_pcvar_num(create_cvar(
.description = MULTI_DESC("MM_DESC_SHAKE"),
bind_pcvar_num(create_cvar(
.description = MULTI_DESC("MM_DESC_SCREENFADE"),
bind_pcvar_num(create_cvar(
.description = MULTI_DESC("MM_DESC_POISONING"),
bind_pcvar_num(create_cvar(
.description = MULTI_DESC("MM_DESC_KILL"),
bind_pcvar_num(create_cvar(
.description = MULTI_DESC("MM_DESC_HUD_INFO"),
bind_pcvar_float(create_cvar(
.name = "mr_time_poisoning",
.description = MULTI_DESC("MM_DESC_TIME_POISONING")),
eCvars[MM_TIME_POISONING]
bind_pcvar_float(create_cvar(
.description = MULTI_DESC("MM_DESC_TIME_HAPPY")),
@FM_SetClientKeyValue_Pre(id, const Infobuffer[], const Key[])
if(BIT_VALID(BitCustomModel, id) && equal(Key, "model"))
fm_cs_get_user_model(id, CurrentModel, charsmax(CurrentModel));
if(!equal(CurrentModel, PlayerModel[id]))
fm_cs_set_user_model(id, PlayerModel[id]);
stock fm_cs_get_user_model(id, Model[], Len)
engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, id), "model", Model, Len);
stock fm_cs_set_user_model(id, const ModelName[])
engfunc(EngFunc_SetClientKeyValue, id, engfunc(EngFunc_GetInfoKeyBuffer, id), "model", ModelName);
copy(PlayerModel[id], charsmax(PlayerModel[]), ModelName);
BIT_ADD(BitCustomModel, id);
stock fm_cs_reset_user_model(id)
BIT_SUB(BitCustomModel, id);
dllfunc(DLLFunc_ClientUserInfoChanged, id, engfunc(EngFunc_GetInfoKeyBuffer, id));
stock ScreenFade(id, fade)
msg_screenfade = get_user_msgid("ScreenFade");
case 1: { time = 1; hold = 1; flags = 4; }
case 2: { time = 4096; hold = 1024; flags = 1; }
default: { time = 4096; hold = 1024; flags = 2; }
message_begin(MSG_ONE, msg_screenfade, _, id);
write_byte(random_num(0, 100));
write_byte(random_num(100, 200));
write_byte(random_num(200, 255));
stock ScreenShake(id, Amplitude, Duration, Frequency, Reliable = 0)
message_begin(Reliable ? MSG_ONE : MSG_ONE_UNRELIABLE, 97, { 0.0, 0.0, 0.0 }, id);
stock SendAudio(id, const audio[], pitch)
MsgSendAudio = get_user_msgid("SendAudio");
message_begin(id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, MsgSendAudio, _, id);