Plugin Xmas Lights On Maps! - eLLectro - 11-24-2025
Plugin Xmas Lights On Maps
This plugin adds a simple and intuitive menu that allows server administrators to create decorative sprites on any map — perfect for adding Christmas lights, festive effects, or other visual elements. Using the in-game menu, you can place sprites anywhere on the map in real time, without needing to edit the map or restart the server. The plugin automatically generates a separate .ini configuration file for each map. Every sprite you place is saved with its coordinates, so the decorations load automatically the next time the map is played. This makes it extremely easy to customize every map with unique holiday lights and decorations.
COMMANDS:
light
Code:
#include <amxmisc>
#include <engine>
#include <fakemeta>
#define pev_light pev_iuser1
enum _:STRSPRPARAM {
Float:RP_STR_CORDX, //Координаты начала
Float:RP_STR_CORDY,
Float:RP_STR_CORDZ,
Float:RP_END_CORDX, //Координаты конца
Float:RP_END_CORDY,
Float:RP_END_CORDZ,
RP_SEGMENT, //Количество точек.
bool:RP_CURVE, //Кривизна.
bool:RP_BLINK, //Мерцание.
bool:RP_COLOR_RAND, //Цвет случайный/сохранённый (1/0)
RP_COL_R, //Если не случайный то тут сохранён цвет.
RP_COL_G,
RP_COL_B,
bool:RP_START,
RP_COLOR
};
new Array:g_ArrSprPar;
new g_PlArrParam[33][STRSPRPARAM];
new g_iCount;
new g_szSprite[][] = {
"sprites/redspr.spr"
}
new g_szPathFile[256];
new g_szClassName[] = "class_light";
enum _:COLORTYPE {
COL_R,
COL_G,
COL_B,
COL_NAME[32]
}
new g_szColor[][COLORTYPE] = { // <= Цвета добавлять здесь. Но случайный не трогать и только после него!
{0,0,0,"Random"},
{255,0,0,"Red"},
{0,255,0,"Green"},
{0,0,255,"Blue"},
{55,163,221,"Light Blue"},
{235,206,41,"Yellow"},
{176,43,234,"Purple"}
}
public plugin_precache() {
for(new i=0;i<sizeof(g_szSprite);i++)
precache_model(g_szSprite[i]);
g_ArrSprPar = ArrayCreate(STRSPRPARAM);
ReadSaveParam();
}
public ReadSaveParam() {
new szLoadDir[128],szMapName[64];
get_mapname(szMapName,charsmax(szMapName));
get_configsdir(szLoadDir, charsmax(szLoadDir));
formatex(szLoadDir, charsmax(szLoadDir), "%s/lightMap",szLoadDir)
if(!dir_exists(szLoadDir)) mkdir(szLoadDir);
formatex(g_szPathFile, charsmax(g_szPathFile), "%s/%s.ini",szLoadDir,szMapName)
if(file_exists(g_szPathFile)) {
enum STRCORD {STR_X,STR_Y,STR_Z,END_X,END_Y,END_Z};
new szParse[256],szCord[STRCORD][8],szSegment[8],szCurve[5],szBlink[5],szColRand[5],szColR[8],szColG[8],szColB[8];
new ArrSprPar[STRSPRPARAM];
len = formatex(menu[len], charsmax(menu) - len, "\rGarland Menu. Total \d[\r%d\d]^n\yLights in garland \d[\r%d\d]^n^n",g_iCount,g_PlArrParam[id][RP_SEGMENT]+1);
len += formatex(menu[len], charsmax(menu) - len, "\r[1] \w%s^n",g_PlArrParam[id][RP_START] ? "End":"Start");
len += formatex(menu[len], charsmax(menu) - len, "\r[2] \wColor: \d[\y%s\d]^n",g_szColor[g_PlArrParam[id][RP_COLOR]][COL_NAME]);
len += formatex(menu[len], charsmax(menu) - len, "\r[3] \wAdd lights^n");
len += formatex(menu[len], charsmax(menu) - len, "\r[4] \wRemove lights^n^n");
len += formatex(menu[len], charsmax(menu) - len, "\r[5] \wShape \d[\y%s\d]^n",g_PlArrParam[id][RP_CURVE] ? "Curved":"Straight");
if(g_PlArrParam[id][RP_COLOR] == 0)
len += formatex(menu[len], charsmax(menu) - len, "\r[6] \wBlinking \d[\y%s\d]^n^n",g_PlArrParam[id][RP_BLINK] ? "On":"Off");
else len += formatex(menu[len], charsmax(menu) - len, "^n^n");
len += formatex(menu[len], charsmax(menu) - len, "\r[7] \wDelete last^n");
len += formatex(menu[len], charsmax(menu) - len, "\r[8] \wDelete all^n");
len += formatex(menu[len], charsmax(menu) - len, "\r[9] \wSave^n");
len += formatex(menu[len], charsmax(menu) - len, "^n\r[0] \wExit");
new keys = MENU_KEY_0|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_9;
show_menu(id, keys, menu, -1, "lightmenu");
return PLUGIN_HANDLED;
}
public lightmenu_function(id,key) {
switch(key) {
case 0: {
new Origin[3],Float:fOrigin[3];
get_user_origin(id, Origin, 3);
for(new i=0;i<sizeof(fOrigin);i++)
fOrigin[i] = float(Origin[i]);