#include #include #include #include #define PLUGIN "Winter Events" #define VERSION "1.0" #define AUTHOR "Alka" new const gSnowManModel[] = "models/frost_man.mdl"; new const gSnowManClassname[] = "snow_man"; new const gSnowBallModel[] = "sprites/bhit.spr"; new const gSnowBallClassname[] = "snow_ball"; new const gBombModel[] = "models/christmastree.mdl"; new gSnowBallLife = 5; new gAccessFlag = ADMIN_BAN; new const gGunsEvents[][] = { "events/awp.sc", "events/g3sg1.sc", "events/ak47.sc", "events/scout.sc", "events/m249.sc", "events/m4a1.sc", "events/sg552.sc", "events/aug.sc", "events/sg550.sc", "events/m3.sc", "events/xm1014.sc", "events/usp.sc", "events/mac10.sc", "events/ump45.sc", "events/fiveseven.sc", "events/p90.sc", "events/deagle.sc", "events/p228.sc", "events/glock18.sc", "events/mp5n.sc", "events/tmp.sc", "events/elite_left.sc", "events/elite_right.sc", "events/galil.sc", "events/famas.sc" } new gEventsIndex[sizeof gGunsEvents]; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR); register_forward(FM_PlaybackEvent, "Fwd_PlaybackEvent"); register_forward(FM_Think, "Fwd_Think"); register_forward(FM_SetModel, "Fwd_SetModel"); register_clcmd("say !addsnowman", "cmdAddSnowman", -1); register_clcmd("say !removesnowman", "cmdRemoveSnowman", -1); register_clcmd("say !rotatesnowman", "cmdRotateSnowman", -1); register_clcmd("say !saveorigins", "cmdSaveOrigins", -1); } public plugin_precache() { engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_snow")); for(new i = 0 ; i < sizeof gGunsEvents ; i++) { gEventsIndex[i] = engfunc(EngFunc_PrecacheEvent, 1, gGunsEvents[i]); } precache_model(gSnowManModel); precache_model(gSnowBallModel); precache_model(gBombModel); } public plugin_cfg() { static sConfigsDir[64], sFile[64]; get_configsdir(sConfigsDir, sizeof sConfigsDir - 1); static sMapName[32]; get_mapname(sMapName, sizeof sMapName - 1); formatex(sFile, sizeof sFile - 1, "%s/%s_snowman_origins.cfg", sConfigsDir, sMapName); if(!file_exists(sFile)) return 1; static sFileOrigin[3][32], sFileAngles[3][32], iLine, iLength, sBuffer[256]; static sTemp1[128], sTemp2[128]; static Float:fOrigin[3], Float:fAngles[3]; while(read_file(sFile, iLine++, sBuffer, sizeof sBuffer - 1, iLength)) { if((sBuffer[0]==';') || !iLength) continue; strtok(sBuffer, sTemp1, sizeof sTemp1 - 1, sTemp2, sizeof sTemp2 - 1, '|', 0); parse(sTemp1, sFileOrigin[0], sizeof sFileOrigin[] - 1, sFileOrigin[1], sizeof sFileOrigin[] - 1, sFileOrigin[2], sizeof sFileOrigin[] - 1); fOrigin[0] = str_to_float(sFileOrigin[0]); fOrigin[1] = str_to_float(sFileOrigin[1]); fOrigin[2] = str_to_float(sFileOrigin[2]); parse(sTemp2, sFileAngles[0], sizeof sFileAngles[] - 1, sFileAngles[1], sizeof sFileAngles[] - 1, sFileAngles[2], sizeof sFileAngles[] - 1); fAngles[0] = str_to_float(sFileAngles[0]); fAngles[1] = str_to_float(sFileAngles[1]); fAngles[2] = str_to_float(sFileAngles[2]); static iEnt; iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")); if(!iEnt) return 0; engfunc(EngFunc_SetOrigin, iEnt, fOrigin); set_pev(iEnt, pev_angles, fAngles); static Float:fMaxs[3] = { 16.0, 16.0, 38.0 }; static Float:fMins[3] = { -16.0, -16.0, -38.0 }; engfunc(EngFunc_SetModel, iEnt, gSnowManModel); set_pev(iEnt, pev_classname, gSnowManClassname); dllfunc(DLLFunc_Spawn, iEnt); set_pev(iEnt, pev_solid, SOLID_BBOX); engfunc(EngFunc_SetSize, iEnt, fMins, fMaxs); } return 1; } public Fwd_PlaybackEvent(flags, id, eventindex) { for(new i = 0 ; i < sizeof gGunsEvents ; i++) { if(eventindex == gEventsIndex[i]) { static Float:fAimOrigin[3]; fm_get_aimorigin(id, fAimOrigin); if(engfunc(EngFunc_PointContents, fAimOrigin) != CONTENTS_SKY) { static iEnt; iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")); if(!iEnt) return FMRES_IGNORED; set_pev(iEnt, pev_solid, SOLID_NOT); set_pev(iEnt, pev_movetype, MOVETYPE_NONE); engfunc(EngFunc_SetModel, iEnt, gSnowBallModel); set_pev(iEnt, pev_classname, gSnowBallClassname); engfunc(EngFunc_SetOrigin, iEnt, fAimOrigin); fm_set_rendering(iEnt, kRenderFxNoDissipation, 255, 255, 255, kRenderGlow, 255); set_pev(iEnt, pev_flags, FL_ALWAYSTHINK); set_pev(iEnt, pev_nextthink, get_gametime() + float(gSnowBallLife)); return FMRES_IGNORED; } } } return FMRES_IGNORED; } public Fwd_Think(Ent) { if(!pev_valid(Ent)) return FMRES_IGNORED; static sClassName[32]; pev(Ent, pev_classname, sClassName, sizeof sClassName - 1); if(!strcmp(sClassName, gSnowBallClassname, 1)) { engfunc(EngFunc_RemoveEntity, Ent); } return FMRES_IGNORED; } public Fwd_SetModel(Ent, const szModel[]) { if(!pev_valid(Ent)) return FMRES_IGNORED; if(!strcmp(szModel, "models/w_c4.mdl")) { engfunc(EngFunc_SetModel, Ent, gBombModel); return FMRES_SUPERCEDE; } return FMRES_IGNORED; } public cmdAddSnowman(id) { if(!access(id, gAccessFlag)) return 1; if(!is_user_alive(id)) return 1; static Float:fAimOrigin[3]; fm_get_aimorigin(id, fAimOrigin); if((engfunc(EngFunc_PointContents, fAimOrigin) != CONTENTS_SKY) && (engfunc(EngFunc_PointContents, fAimOrigin) != CONTENTS_SOLID)) { static iEnt; iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")); if(!iEnt) return 0; engfunc(EngFunc_SetOrigin, iEnt, fAimOrigin); static Float:fMaxs[3] = { 16.0, 16.0, 38.0 }; static Float:fMins[3] = { -16.0, -16.0, -38.0 }; engfunc(EngFunc_SetModel, iEnt, gSnowManModel); set_pev(iEnt, pev_classname, gSnowManClassname); dllfunc(DLLFunc_Spawn, iEnt); set_pev(iEnt, pev_solid, SOLID_BBOX); engfunc(EngFunc_SetSize, iEnt, fMins, fMaxs); client_print(id, print_chat, "Successfuly created a snowman!Now save the origins ^"!saveorigins^""); } else client_print(id, print_chat, "Sorry, but that location is unavailable!"); return 0; } public cmdRemoveSnowman(id) { if(!access(id, gAccessFlag)) return 1; if(!is_user_alive(id)) return 1; static iEnt, iBody; get_user_aiming(id, iEnt, iBody); if(pev_valid(iEnt)) { static sClassname[32]; pev(iEnt, pev_classname, sClassname, sizeof sClassname - 1); if(!strcmp(sClassname, gSnowManClassname, 1)) { engfunc(EngFunc_RemoveEntity, iEnt); client_print(id, print_chat, "Successfuly, you removed a snowman!Now save the origins ^"!saveorigins^""); } else client_print(id, print_chat, "Sorry, you must aim at an snowman to remove it!"); } return 0; } public cmdSaveOrigins(id) { if(!access(id, gAccessFlag)) return 1; if(!is_user_alive(id)) return 1; static sConfigsDir[64], sFile[64]; get_configsdir(sConfigsDir, sizeof sConfigsDir - 1); static sMapName[32]; get_mapname(sMapName, sizeof sMapName - 1); formatex(sFile, sizeof sFile - 1, "%s/%s_snowman_origins.cfg", sConfigsDir, sMapName); if(file_exists(sFile)) delete_file(sFile); new iEnt = -1, Float:fEntOrigin[3], Float:fEntAngles[3], iCount; static sBuffer[256]; while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", gSnowManClassname))) { pev(iEnt, pev_origin, fEntOrigin); pev(iEnt, pev_angles, fEntAngles); formatex(sBuffer, sizeof sBuffer - 1, "%f %f %f | %f %f %f", fEntOrigin[0], fEntOrigin[1], fEntOrigin[2], fEntAngles[0], fEntAngles[1], fEntAngles[2]); write_file(sFile, sBuffer, -1); iCount++; } client_print(id, print_chat, "Successfuly saved all snowman origins (%d) for map %s!", iCount,sMapName); return 0; } public cmdRotateSnowman(id) { if(!access(id, gAccessFlag)) return 1; if(!is_user_alive(id)) return 1; static iEnt, iBody; get_user_aiming(id, iEnt, iBody); if(pev_valid(iEnt)) { static sClassname[32]; pev(iEnt, pev_classname, sClassname, sizeof sClassname - 1); if(!strcmp(sClassname, gSnowManClassname, 1)) { static Float:fAngles[3]; pev(iEnt, pev_angles, fAngles); fAngles[1] += 90.0; set_pev(iEnt, pev_angles, fAngles); client_print(id, print_chat, "Successfuly, you rotated a snowman!Now save the origins ^"!saveorigins^""); } else client_print(id, print_chat, "Sorry, you must aim at an snowman to rotate it!"); } return 0; } public client_connect(id) client_cmd(id, "cl_weather 1"); stock fm_get_aimorigin(index, Float:origin[3]) { new Float:start[3], Float:view_ofs[3]; pev(index, pev_origin, start); pev(index, pev_view_ofs, view_ofs); xs_vec_add(start, view_ofs, start); new Float:dest[3]; pev(index, pev_v_angle, dest); engfunc(EngFunc_MakeVectors, dest); global_get(glb_v_forward, dest); xs_vec_mul_scalar(dest, 9999.0, dest); xs_vec_add(start, dest, dest); engfunc(EngFunc_TraceLine, start, dest, 0, index, 0); get_tr2(0, TR_vecEndPos, origin); return 1; } stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16) { static Float:rendercolor[3]; rendercolor[0] = float(r); rendercolor[1] = float(g); rendercolor[2] = float(b); set_pev(entity, pev_renderfx, fx) set_pev(entity, pev_rendercolor, rendercolor); set_pev(entity, pev_rendermode, render); set_pev(entity, pev_renderamt, float(amount)); return 1; }