#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <shop>
// Force 1.7 syntax
//#pragma newdecls required
#define PLUGIN_VERSION "1.2.1"
#define CATEGORY "neon"
new g_iClientColor[MAXPLAYERS+1][4];
new g_iNeon[MAXPLAYERS+1];
new Handle:g_hKv
public Plugin:myinfo =
{
name = "[Shop] ",
author = "Smoke",
version = "1.0"
}
public OnPluginStart()
{
HookEvent("player_spawn", Event_PlayerSpawn);
HookEvent("player_death", Event_PlayerDeath);
if (Shop_IsStarted()) Shop_Started();
}
public OnMapStart()
{
decl String:buffer[256];
if (g_hKv != null) g_hKv.Close();
g_hKv = new KeyValues("Neon");
Shop_GetCfgFile(buffer, sizeof(buffer), "neon.txt");
if (!g_hKv.ImportFromFile(buffer)) SetFailState("Couldn't parse file %s", buffer);
}
public OnPluginEnd()
{
Shop_UnregisterMe();
}
public Shop_Started()
{
if (g_hKv == null) OnMapStart();
g_hKv.Rewind();
decl cName[80]; decl cDescription[80];
g_hKv.GetString("name", cName, sizeof(cName), "Neon");
g_hKv.GetString("description", cDescription, sizeof(cDescription));
CategoryId category_id = Shop_RegisterCategory(CATEGORY, cName, cDescription);
g_hKv.Rewind();
if (g_hKv.GotoFirstSubKey(true))
{
do
{
if (g_hKv.GetSectionName(cName, sizeof(cName)) && Shop_StartItem(category_id, cName))
{
g_hKv.GetString("name", cName, sizeof(cName), cName);
g_hKv.GetString("description", cDescription, sizeof(cDescription), "");
Shop_SetInfo(cName, cDescription, g_hKv.GetNum("price", 1000), g_hKv.GetNum("sellprice", -1), Item_Togglable, g_hKv.GetNum("duration", 604800));
Shop_SetCallbacks(_, OnEquipItem);
Shop_EndItem();
}
} while (g_hKv.GotoNextKey(true));
}
g_hKv.Rewind();
}
public ShopAction:OnEquipItem(iClient, CategoryId:category_id, const String:category[], ItemId:item_id, const String:item[], bool:isOn, bool:elapsed)
{
if (isOn || elapsed)
{
OnClientDisconnect(iClient);
return Shop_UseOff;
}
Shop_ToggleClientCategoryOff(iClient, category_id);
if (g_hKv.JumpToKey(cItem, false) && IsPlayerAlive(iClient))
{
iColor[4];
g_hKv.GetColor("color", iColor[0], iColor[1], iColor[2], iColor[3]);
g_hKv.Rewind();
for (new i = 0; i < 4; i++)
g_iClientColor[iClient][i] = iColor[i];
SetClientNeon(iClient);
return Shop_UseOn;
}
PrintToChat(iClient, "Failed to use \"%s\".", cItem);
return Shop_Raw;
}
public OnClientDisconnect(iClient)
{
RemoveNeon(iClient);
}
public OnClientPostAdminCheck(iClient)
{
RemoveNeon(iClient);
}
public Action Event_PlayerSpawn(iClient, iTeam, bool:dontBroadcast)
{
if (iClient > 0 && g_iNeon[iClient] && IsPlayerAlive(iClient))
{
SetClientNeon(iClient);
}
}
public Action:Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
RemoveNeon(GetClientOfUserId(GetEventInt(event, "userid")));
}
RemoveNeon(iClient)
{
if(g_iNeon[iClient] > 0 && IsValidEdict(g_iNeon[iClient]))
{
AcceptEntityInput(g_iNeon[iClient], "Kill");
}
g_iNeon[iClient] = 0;
}
SetClientNeon(iClient)
{
RemoveNeon(iClient);
decl Float:clientOrigin[3], Float:pos[3], Float:beampos[3], Float:FurnitureOrigin[3];
GetClientAbsOrigin(iClient, clientOrigin);
GetCollisionPoint(iClient, pos);
FurnitureOrigin[0] = pos[0];
FurnitureOrigin[1] = pos[1];
FurnitureOrigin[2] = (pos[2] + 50);
beampos[0] = pos[0];
beampos[1] = pos[1];
beampos[2] = (FurnitureOrigin[2] + 20);
new Neon = CreateEntityByName("light_dynamic");
DispatchKeyValue(Neon, "brightness", "5");
decl String:str_color[25]; FormatEx(str_color, 25, "%d %d %d %d", g_iClientColor[iClient][0], g_iClientColor[iClient][1], g_iClientColor[iClient][2], g_iClientColor[iClient][3]);
DispatchKeyValue(Neon, "_light", str_color);
DispatchKeyValue(Neon, "spotlight_radius", "50");
DispatchKeyValue(Neon, "distance", "150");
DispatchKeyValue(Neon, "style", "0");
SetEntPropEnt(Neon, Prop_Send, "m_hOwnerEntity", iClient);
if(DispatchSpawn(Neon))
{
AcceptEntityInput(Neon, "TurnOn");
g_iNeon[iClient] = Neon;
TeleportEntity(Neon, clientOrigin, NULL_VECTOR, NULL_VECTOR);
SetVariantString("!activator");
AcceptEntityInput(Neon, "SetParent", iClient, Neon, 0);
} else g_iNeon[iClient] = 0;
}
GetCollisionPoint(iClient, Float:pos[3])
{
decl Float:vOrigin[3], Float:vAngles[3];
GetClientEyePosition(iClient, vOrigin);
GetClientEyeAngles(iClient, vAngles);
new Handle:trace = TR_TraceRayFilterEx(vOrigin, vAngles, MASK_SOLID, RayType_Infinite, TraceEntityFilterPlayer);
if(TR_DidHit(trace))
{
TR_GetEndPosition(pos, trace);
CloseHandle(trace);
return;
}
CloseHandle(trace);
}
public bool:TraceEntityFilterPlayer(entity, contentsMask)
{
return entity > MaxClients;
}