#pragma semicolon 1 #define DEBUG #define PLUGIN_AUTHOR "jenz" #define PLUGIN_VERSION "2.00" #define MAX_DEFINED_COLORS 128 #define MAX_DEFINED_MATERIALS 128 //taser #define TASER "weapon_tracers_taser" #define GLOW "weapon_taser_glow_impact" #define SOUND_IMPACT "weapons/taser/taser_hit.wav" #define SOUND_SHOOT "weapons/taser/taser_shoot.wav" #include #include #include #include #include #include #undef REQUIRE_EXTENSIONS #tryinclude #define REQUIRE_EXTENSIONS #pragma newdecls required //potentially 1024 bits char g_cStorestats[MAXPLAYERS][526]; bool g_bZeusOwner[MAXPLAYERS]; float g_fLastAngles[MAXPLAYERS + 1][3]; int g_iTracerpref[MAXPLAYERS]; int g_iPlayerRank[MAXPLAYERS + 1]; int g_iPlayerPoints[MAXPLAYERS + 1]; int g_iTEsends[MAXPLAYERS]; int g_iBeam = -1; int g_iPlayerCount; int g_iPlayerCountTop10; int g_iPlayerArrayTop10[MAXPLAYERS]; int g_iPlayerArray[MAXPLAYERS]; int g_iStoreColors[MAXPLAYERS][3]; bool g_bStoreColorbool[MAXPLAYERS]; public Plugin myinfo = { name = "Unloze Tracers based on zeustracers", author = PLUGIN_AUTHOR, description = "Grants sprayTracers based on clients ranking", version = PLUGIN_VERSION, url = "https://forums.alliedmods.net/showthread.php?p=2501632" }; //Startup public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max) { return APLRes_Success; } public void OnPluginStart() { //Reg Cmds RegConsoleCmd("sm_tracers", Cmd_Tracer, "enable/ disable tracers"); //mysql SQL_StartConnection(); AddTempEntHook("Shotgun Shot", Hook_BulletShot); HookEvent("bullet_impact", Event_OnBulletImpact); HookEvent("round_start", Event_RoundStart); } public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast) { for (int i = 0; i < MaxClients; i++) { if (IsValidClient(i) && IsPlayerAlive(i)) { g_iTEsends[i] = 0; } } } public void OnMapStart() { g_iBeam = PrecacheModel("materials/unloze_tracers/xbeam.vmt"); AddFileToDownloadsTable("materials/unloze_tracers/xbeam.vmt"); AddFileToDownloadsTable("materials/unloze_tracers/xbeam.vtf"); PrecacheEffect("ParticleEffect"); PrecacheParticleEffect(TASER); PrecacheParticleEffect(GLOW); PrecacheSound(SOUND_IMPACT); PrecacheSound(SOUND_SHOOT); } void PrecacheEffect(const char[] sEffectName) { static int table = INVALID_STRING_TABLE; if (table == INVALID_STRING_TABLE) table = FindStringTable("EffectDispatch"); bool save = LockStringTables(false); AddToStringTable(table, sEffectName); LockStringTables(save); } void PrecacheParticleEffect(const char[] sEffectName) { static int table = INVALID_STRING_TABLE; if (table == INVALID_STRING_TABLE) table = FindStringTable("ParticleEffectNames"); bool save = LockStringTables(false); AddToStringTable(table, sEffectName); LockStringTables(save); } public Action Cmd_Tracer(int client, int args) { Menu menu = new Menu(MenuHandler1); menu.SetTitle("UNLOZE tracers are unlocked through !shop"); menu.AddItem("", "Toggle Tracer Visibility"); if (StrContains(g_cStorestats[client], "k") >= 0) { menu.AddItem("", "Zeus tracers"); } if (StrContains(g_cStorestats[client], "§") >= 0) { menu.AddItem("255 255 0", "Yellow Tracers"); } if (StrContains(g_cStorestats[client], "@") >= 0) { menu.AddItem("0 0 255", "Blue Tracers"); } if (StrContains(g_cStorestats[client], "£") >= 0) { menu.AddItem("0 255 0", "Green Tracers"); } if (StrContains(g_cStorestats[client], "$") >= 0) { menu.AddItem("255 0 0", "Red Tracers"); } if (StrContains(g_cStorestats[client], "€") >= 0) { menu.AddItem("255 215 0", "Gold Tracers"); } if (StrContains(g_cStorestats[client], "(") >= 0) { menu.AddItem("0 255 255", "cyan Tracers"); } menu.ExitButton = true; menu.Display(client, 0); return Plugin_Handled; } public int MenuHandler1(Menu menu, MenuAction action, int param1, int choice) { char info[256]; menu.GetItem(choice, info, sizeof(info)); if (action == MenuAction_Cancel) { //PrintToServer("Client %d's menu was cancelled. Reason: %d", param1, choice); } else if (action == MenuAction_End) { delete menu; } else if (action == MenuAction_Select) { if (choice == 0) { g_bZeusOwner[param1] = false; g_bStoreColorbool[param1] = false; static char SID[32]; GetClientAuthId(param1, AuthId_Steam2, SID, sizeof(SID)); if (g_iTracerpref[param1] == 0) { g_iTracerpref[param1] = 1; PrintToChat(param1, "Disabled tracers"); } else { g_iTracerpref[param1] = 0; PrintToChat(param1, "Enabled tracers"); } ClientCount(); tracerprefMYSQL(param1); return 0; } else if (choice == 1) { g_bZeusOwner[param1] = true; g_bStoreColorbool[param1] = false; } else if (choice > 1) { char l_cColorPref[256]; g_bStoreColorbool[param1] = true; g_bZeusOwner[param1] = false; Format(l_cColorPref, sizeof(l_cColorPref), info); char sPart[3][526]; ExplodeString(l_cColorPref, " ", sPart, 3, 526); g_iStoreColors[param1][0] = StringToInt(sPart[0]); g_iStoreColors[param1][1] = StringToInt(sPart[1]); g_iStoreColors[param1][2] = StringToInt(sPart[2]); InsertTracerPrefMYSQL(param1, l_cColorPref); } } ClientCount(); return 0; } public Action Event_OnBulletImpact(Event event, const char[] name, bool dontBroadcast) { int client = GetClientOfUserId(event.GetInt("userid")); //unnecesary checks but eh if (!IsClientInGame(client) || IsFakeClient(client) || g_iPlayerArray[0] == '\0' || g_iPlayerCount < 1) { return Plugin_Handled; } if (g_iTracerpref[client] == 1) { return Plugin_Handled; } //bought tracers for 25000 tokens in the shop if true if (!g_bZeusOwner[client] && !g_bStoreColorbool[client]) { //making sure if not bought from shop that atleast rank 32 and 5000 points if (g_iPlayerRank[client] > 32 || g_iPlayerPoints[client] < 5000) { //PrintToChatAll("g_cStorestats client %N: %s", client, g_cStorestats[client]); return Plugin_Handled; } } ++g_iTEsends[client]; if (g_iTEsends[client] < 2) { return Plugin_Handled; } g_iTEsends[client] = 0; float impact_pos[3]; float fPosition[3], fImpact[3], fDifference[3]; float muzzle_pos[3], camera_pos[3]; float pov_pos[3]; int l_iStoreColors[3]; GetClientEyePosition(client, fPosition); impact_pos[0] = event.GetFloat("x"); impact_pos[1] = event.GetFloat("y"); impact_pos[2] = event.GetFloat("z"); fImpact[0] = GetEventFloat (event, "x"); fImpact[1] = GetEventFloat (event, "y"); fImpact[2] = GetEventFloat (event, "z"); GetWeaponAttachmentPosition(client, "muzzle_flash", muzzle_pos); GetWeaponAttachmentPosition(client, "camera_buymenu", camera_pos); //Create an offset for first person pov_pos[0] = muzzle_pos[0] - camera_pos[0]; pov_pos[1] = muzzle_pos[1] - camera_pos[1]; pov_pos[2] = muzzle_pos[2] - camera_pos[2] + 0.1; ScaleVector(pov_pos, 0.4); SubtractVectors(muzzle_pos, pov_pos, pov_pos); //Move the beam a bit forward so it isn't too close for first person float distance = GetVectorDistance(pov_pos, impact_pos); float percentage = 0.2 / (distance / 100); pov_pos[0] = pov_pos[0] + ((impact_pos[0] - pov_pos[0]) * percentage); pov_pos[1] = pov_pos[1] + ((impact_pos[1] - pov_pos[1]) * percentage); pov_pos[2] = pov_pos[2] + ((impact_pos[2] - pov_pos[2]) * percentage); float fDistance = GetVectorDistance(fPosition, fImpact); float fPercent = (0.4 / (fDistance / 100.0)); fDifference[0] = fPosition[0] + ((fImpact[0] - fPosition[0]) * fPercent); fDifference[1] = fPosition[1] + ((fImpact[1] - fPosition[1]) * fPercent) - 0.08; fDifference[2] = fPosition[2] + ((fImpact[2] - fPosition[2]) * fPercent); //MASK_SOLID_BRUSHONLY Handle trace = TR_TraceRayFilterEx(fDifference, fImpact, MASK_SHOT, RayType_EndPoint, Bool_TraceFilterPlayers); TR_GetEndPosition(fImpact, trace); CloseHandle(trace); if (g_bZeusOwner[client]) { if (g_iPlayerArrayTop10[0] == '\0' || g_iPlayerCountTop10 < 1) { return Plugin_Handled; } TE_DispatchEffect(TASER, impact_pos, pov_pos, g_fLastAngles[client]); TE_Send(g_iPlayerArrayTop10, g_iPlayerCountTop10); //Display the particle to everyone else under the normal position TE_DispatchEffect(TASER, impact_pos, muzzle_pos, g_fLastAngles[client]); TE_Send(g_iPlayerArray, g_iPlayerCount); //Move the impact glow a bit out so it doesn't clip the wall impact_pos[0] = impact_pos[0] + ((pov_pos[0] - impact_pos[0]) * percentage); impact_pos[1] = impact_pos[1] + ((pov_pos[1] - impact_pos[1]) * percentage); impact_pos[2] = impact_pos[2] + ((pov_pos[2] - impact_pos[2]) * percentage); TE_DispatchEffect(GLOW, impact_pos, impact_pos); TE_Send(g_iPlayerArrayTop10, g_iPlayerCountTop10); TE_DispatchEffect(GLOW, impact_pos, impact_pos); TE_Send(g_iPlayerArray, g_iPlayerCount); //play taser sounds to clients EmitSound(g_iPlayerArrayTop10, g_iPlayerCountTop10, SOUND_SHOOT, client, SNDCHAN_WEAPON, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.15, SNDPITCH_NORMAL); EmitSound(g_iPlayerArrayTop10, g_iPlayerCountTop10, SOUND_IMPACT, client, SNDCHAN_WEAPON, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.15, SNDPITCH_NORMAL); EmitSoundToClient(client, SOUND_SHOOT, client, SNDCHAN_WEAPON, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.15, SNDPITCH_NORMAL); EmitSoundToClient(client, SOUND_IMPACT, client, SNDCHAN_WEAPON, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.15, SNDPITCH_NORMAL); return Plugin_Handled; } else if (g_bStoreColorbool[client]) { l_iStoreColors[0] = g_iStoreColors[client][0]; l_iStoreColors[1] = g_iStoreColors[client][1]; l_iStoreColors[2] = g_iStoreColors[client][2]; } if (g_iPlayerRank[client] > 32) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {192, 192, 192, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } //red else if (g_iPlayerRank[client] > 29 || colorIndex(l_iStoreColors, 255, 0, 0)) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {255, 0, 0, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } else if (g_iPlayerRank[client] > 27) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {255, 77, 0, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } //yellow else if (g_iPlayerRank[client] > 25 || colorIndex(l_iStoreColors, 255, 255, 0)) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {255, 255, 0, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } //blue else if (colorIndex(l_iStoreColors, 0, 0, 255)) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {0, 0, 255, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } //gold else if (colorIndex(l_iStoreColors, 255, 215, 0)) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {255, 215, 0, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } //cyan 0 255 255 else if (colorIndex(l_iStoreColors, 0, 255, 255)) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {0, 255, 255, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } else if (g_iPlayerRank[client] > 23) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {35, 142, 35, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } else if (g_iPlayerRank[client] > 21) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {128, 128, 0, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } else if (g_iPlayerRank[client] > 18) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {64, 224, 208, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } else if (g_iPlayerRank[client] > 15) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {0, 128, 128, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } else if (g_iPlayerRank[client] > 13) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {240, 248, 255, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } else if (g_iPlayerRank[client] > 12) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {128, 0, 128, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } else if (g_iPlayerRank[client] > 9) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {148, 0, 211, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } //green else if (g_iPlayerRank[client] > 6 || colorIndex(l_iStoreColors, 255, 255, 0)) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {0, 255, 0, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } else if (g_iPlayerRank[client] > 3) { TE_SetupBeamPoints(fDifference, fImpact, g_iBeam, 0, 0, 0, 0.6, 4.0, 4.0, 1, 1.1, {218, 112, 214, 105}, 1); TE_Send(g_iPlayerArray, g_iPlayerCount); return Plugin_Handled; } else if (g_iPlayerRank[client] >= 0) { //Display the particle to first person TE_DispatchEffect(TASER, impact_pos, pov_pos, g_fLastAngles[client]); TE_Send(g_iPlayerArrayTop10, g_iPlayerCountTop10); //Display the particle to everyone else under the normal position TE_DispatchEffect(TASER, impact_pos, muzzle_pos, g_fLastAngles[client]); TE_Send(g_iPlayerArray, g_iPlayerCount); //Move the impact glow a bit out so it doesn't clip the wall impact_pos[0] = impact_pos[0] + ((pov_pos[0] - impact_pos[0]) * percentage); impact_pos[1] = impact_pos[1] + ((pov_pos[1] - impact_pos[1]) * percentage); impact_pos[2] = impact_pos[2] + ((pov_pos[2] - impact_pos[2]) * percentage); TE_DispatchEffect(GLOW, impact_pos, impact_pos); TE_Send(g_iPlayerArrayTop10, g_iPlayerCountTop10); TE_DispatchEffect(GLOW, impact_pos, impact_pos); TE_Send(g_iPlayerArray, g_iPlayerCount); //play taser sounds to clients SNDCHAN_STATIC EmitSound(g_iPlayerArrayTop10, g_iPlayerCountTop10, SOUND_SHOOT, client, SNDCHAN_WEAPON, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.15, SNDPITCH_NORMAL); EmitSound(g_iPlayerArrayTop10, g_iPlayerCountTop10, SOUND_IMPACT, client, SNDCHAN_WEAPON, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.15, SNDPITCH_NORMAL); EmitSoundToClient(client, SOUND_SHOOT, client, SNDCHAN_WEAPON, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.15, SNDPITCH_NORMAL); EmitSoundToClient(client, SOUND_IMPACT, client, SNDCHAN_WEAPON, SNDLEVEL_NORMAL, SND_NOFLAGS, 0.15, SNDPITCH_NORMAL); return Plugin_Handled; } return Plugin_Handled; } public Action Hook_BulletShot(const char[] te_name, const int[] Players, int numClients, float delay) { int client = TE_ReadNum("m_iPlayer") + 1; float origin[3]; TE_ReadVector("m_vecOrigin", origin); g_fLastAngles[client][0] = TE_ReadFloat("m_vecAngles[0]"); g_fLastAngles[client][1] = TE_ReadFloat("m_vecAngles[1]"); g_fLastAngles[client][2] = 0.0; float impact_pos[3]; Handle trace = TR_TraceRayFilterEx(origin, g_fLastAngles[client], MASK_SHOT, RayType_Infinite, TR_DontHitSelf, client); if (TR_DidHit(trace)) { TR_GetEndPosition(impact_pos, trace); } delete trace; return Plugin_Continue; } public bool TR_DontHitSelf(int entity, int mask, any data) { if (entity == data) return false; return true; } void GetWeaponAttachmentPosition(int client, const char[] attachment, float pos[3]) { if (!attachment[0]) return; int entity = CreateEntityByName("info_target"); DispatchSpawn(entity); int weapon; if ((weapon = GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon")) == -1) return; if ((weapon = GetEntPropEnt(weapon, Prop_Send, "m_hWeaponWorldModel")) == -1) return; SetVariantString("!activator"); AcceptEntityInput(entity, "SetParent", weapon, entity, 0); SetVariantString(attachment); AcceptEntityInput(entity, "SetParentAttachment", weapon, entity, 0); TeleportEntity(entity, NULL_VECTOR, NULL_VECTOR, NULL_VECTOR); GetEntPropVector(entity, Prop_Data, "m_vecAbsOrigin", pos); AcceptEntityInput(entity, "kill"); } void TE_DispatchEffect(const char[] particle, const float pos[3], const float endpos[3], const float angles[3] = NULL_VECTOR) { TE_Start("EffectDispatch"); TE_WriteFloatArray("m_vStart.x", pos, 3); TE_WriteFloatArray("m_vOrigin.x", endpos, 3); TE_WriteVector("m_vAngles", angles); TE_WriteNum("m_nHitBox", GetParticleEffectIndex(particle)); TE_WriteNum("m_iEffectName", GetEffectIndex("ParticleEffect")); } int GetParticleEffectIndex(const char[] sEffectName) { static int table = INVALID_STRING_TABLE; if (table == INVALID_STRING_TABLE) table = FindStringTable("ParticleEffectNames"); int iIndex = FindStringIndex(table, sEffectName); if (iIndex != INVALID_STRING_INDEX) return iIndex; return 0; } int GetEffectIndex(const char[] sEffectName) { static int table = INVALID_STRING_TABLE; if (table == INVALID_STRING_TABLE) table = FindStringTable("EffectDispatch"); int iIndex = FindStringIndex(table, sEffectName); if (iIndex != INVALID_STRING_INDEX) return iIndex; return 0; } public void OnClientPostAdminCheck(int client) { if (client > 0 && client <= MaxClients && IsClientInGame(client)) { g_bStoreColorbool[client] = false; CheckFlagsMYSQL(client); tracerprefMYSQLpostadmin(client); CheckMYSQLTracerColorPref(client); g_iPlayerRank[client] = CheckMYSQL(client); g_iPlayerPoints[client] = CheckMYSQLPoints(client); g_iTEsends[client] = 0; g_bZeusOwner[client] = false; if (StrContains(g_cStorestats[client], "k") >= 0 && !g_bStoreColorbool[client]) { g_bZeusOwner[client] = true; } ClientCount(); } } public void OnClientDisconnect_Post(int client) { ClientCount(); } public void OnClientDisconnect (int client) { Format(g_cStorestats[client], sizeof(g_cStorestats), ""); g_iPlayerRank[client] = 0; g_iPlayerPoints[client] = 0; g_iTEsends[client] = 0; g_bZeusOwner[client] = false; g_bStoreColorbool[client] = false; g_iTracerpref[client] = 0; g_iStoreColors[client][0] = 0; g_iStoreColors[client][1] = 0; g_iStoreColors[client][2] = 0; } public bool Bool_TraceFilterPlayers(int entity, int contentsMask, any client) { return !entity || entity > MaxClients; } public int CheckMYSQL(int client) { if (client < 1 || client > MaxClients) { return ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index (%d)", client); } if (!IsClientConnected(client)) { return ThrowNativeError(SP_ERROR_NATIVE, "Client %d is not connected", client); } char error[255]; Database db; if (SQL_CheckConfig("stats")) { db = SQL_Connect("stats", true, error, sizeof(error)); } if (db == null) { PrintToChat(client, "{green}[Unloze] {white}Error! Could not connect to MYSQL-DB!"); delete db; return -1; } char sSID[64]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); char sQuery[512]; strcopy(sSID, sizeof(sSID), sSID[8]); //matching up with hlstats_PlayerUniqueIds Format(sQuery, sizeof(sQuery), "SELECT COUNT(*) AS rank FROM hlstats_Players WHERE hlstats_Players.game = 'csgo-ze' AND hideranking = 0 AND skill > (SELECT skill from hlstats_Players JOIN hlstats_PlayerUniqueIds ON hlstats_Players.playerId = hlstats_PlayerUniqueIds.playerId WHERE uniqueId = '%s' AND hlstats_PlayerUniqueIds.game = 'csgo-ze')", sSID); DBResultSet rs; if ((rs = SQL_Query(db, sQuery)) == null) { delete db; delete rs; return -1; } int iCollected; if (!(rs.RowCount > 0)) { iCollected = 0; } else { int iField; rs.FetchRow(); rs.FieldNameToNum("collected", iField); iCollected = rs.FetchInt(iField); } delete rs; delete db; return iCollected; } public void InsertTracerPrefMYSQL(int client, char[] colornumber) { char error[255]; Database db; //the points not related to hlstats are stored together with tracer prefferences but have //their own table if (SQL_CheckConfig("unloze_tracerpref")) { db = SQL_Connect("unloze_tracerpref", true, error, sizeof(error)); } if (db == null) { PrintToChat(client, "{green}[Unloze] {white}Error! Could not connect to MYSQL-DB!"); delete db; return; } char sSID[64]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); char sQuery[512]; Format(sQuery, sizeof(sQuery), "INSERT INTO `unloze_tracerprefColor` (`steam_id`, `Color`) VALUES ('%s','%s') ON DUPLICATE KEY UPDATE `Color` = '%s'", sSID, colornumber, colornumber); SQL_TQuery(db, DummyCallbackSimple, sQuery); delete db; } /*neon idea */ public int CheckMYSQLPoints (int client) { if (client < 1 || client > MaxClients) { return ThrowNativeError(SP_ERROR_NATIVE, "Invalid client index (%d)", client); } if (!IsClientConnected(client)) { return ThrowNativeError(SP_ERROR_NATIVE, "Client %d is not connected", client); } char error[255]; Database db; if (SQL_CheckConfig("levels")) { db = SQL_Connect("levels", true, error, sizeof(error)); } if (db == null) { PrintToChat(client, "{green}[Unloze] {white}Error! Could not connect to MYSQL-DB!"); delete db; return -1; } char sSID[64]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); strcopy(sSID, sizeof(sSID), sSID[8]); //matching up with hlstats_PlayerUniqueIds char sQuery[255]; Format(sQuery, sizeof(sQuery), "SELECT skill from hlstats_Players JOIN hlstats_PlayerUniqueIds ON hlstats_Players.playerId = hlstats_PlayerUniqueIds.playerId WHERE uniqueId = '%s' AND hlstats_PlayerUniqueIds.game = 'csgo-ze'", sSID); DBResultSet rs; if ((rs = SQL_Query(db, sQuery)) == null) { //PrintToConsole(client, "[Unloze] Failed sQuery: %s", sQuery); delete db; delete rs; return -1; } //PrintToConsole(client, "[Unloze] Success sQuery: %s", sQuery); int iCollected; if (!(rs.RowCount > 0)) { iCollected = 0; } else { int iField; rs.FetchRow(); rs.FieldNameToNum("collected", iField); iCollected = rs.FetchInt(iField); } delete rs; delete db; return iCollected; } public void SQL_StartConnection() { char error[255]; Database db; if (SQL_CheckConfig("unloze_tracerpref")) { db = SQL_Connect("unloze_tracerpref", true, error, sizeof(error)); } if (db == null) { CPrintToChatAll("{green}[Unloze] {white}Error! Could not connect to MYSQL-DB!"); delete db; return; } //create tables char sQuery[255]; Format(sQuery, sizeof(sQuery), "CREATE TABLE IF NOT EXISTS `unloze_tracerpref` (`steam_id` VARCHAR(254) NOT NULL, `disabled` VARCHAR(254) NOT NULL, PRIMARY KEY (`steam_id`))"); SQL_TQuery(db, DummyCallbackSimple, sQuery); Format(sQuery, sizeof(sQuery), "CREATE TABLE IF NOT EXISTS `unloze_tracerprefColor` (`steam_id` VARCHAR(254) NOT NULL, `Color` VARCHAR(254) NOT NULL, PRIMARY KEY (`steam_id`))"); SQL_TQuery(db, DummyCallbackSimple, sQuery); delete db; } public void tracerprefMYSQL(int client) { char error[255]; Database db; if (SQL_CheckConfig("unloze_tracerpref")) { db = SQL_Connect("unloze_tracerpref", true, error, sizeof(error)); } if (db == null) { CPrintToChatAll("{green}[Unloze] {white}Error! Could not connect to MYSQL-DB!"); delete db; return; } //create tables char sQuery[255]; char sSID[64]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); if (g_iTracerpref[client] == 1) { Format(sQuery, sizeof(sQuery), "INSERT INTO `unloze_tracerpref` (`steam_id`, `disabled`) VALUES ('%s','1') ON DUPLICATE KEY UPDATE `disabled` = '1'", sSID); } else if (g_iTracerpref[client] == 0) { Format(sQuery, sizeof(sQuery), "DELETE FROM unloze_tracerpref WHERE `steam_id` = '%s'", sSID); } SQL_TQuery(db, DummyCallbackSimple, sQuery); delete db; } public void CheckMYSQLTracerColorPref(int client) { char error[255]; Database db; //the points not related to hlstats are stored together with tracer prefferences but have //their own table if (SQL_CheckConfig("unloze_tracerpref")) { db = SQL_Connect("unloze_tracerpref", true, error, sizeof(error)); } if (db == null) { PrintToChat(client, "{green}[Unloze] {white}Error! Could not connect to MYSQL-DB!"); delete db; return; } char sSID[64]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); char sQuery[512]; Format(sQuery, sizeof(sQuery), "SELECT Color FROM `unloze_tracerprefColor` WHERE `steam_id` = '%s'", sSID); DBResultSet rs; if ((rs = SQL_Query(db, sQuery)) == null) { delete db; delete rs; return; } if (rs.RowCount > 0 && rs.FetchRow()) { char translate[124]; char sPart[3][526]; SQL_FetchString(rs, 0, translate, MAX_NAME_LENGTH); ExplodeString(translate, " ", sPart, 3, 526); g_iStoreColors[client][0] = StringToInt(sPart[0]); g_iStoreColors[client][1] = StringToInt(sPart[1]); g_iStoreColors[client][2] = StringToInt(sPart[2]); g_bStoreColorbool[client] = true; delete rs; delete db; return; } g_iStoreColors[client][0] = 0; g_iStoreColors[client][1] = 0; g_iStoreColors[client][2] = 0; delete rs; delete db; } public void tracerprefMYSQLpostadmin(int client) { char error[255]; Database db; if (SQL_CheckConfig("unloze_tracerpref")) { db = SQL_Connect("unloze_tracerpref", true, error, sizeof(error)); } if (db == null) { CPrintToChatAll("{green}[Unloze] {white}Error! Could not connect to MYSQL-DB!"); delete db; return; } //create tables char sQuery[255]; char sSID[64]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); Format(sQuery, sizeof(sQuery), "SELECT disabled FROM `unloze_tracerpref` WHERE `steam_id` = '%s'", sSID); DBResultSet rs; if ((rs = SQL_Query(db, sQuery)) == null) { delete db; delete rs; return; } if (!(rs.RowCount > 0)) { g_iTracerpref[client] = 0; } else { g_iTracerpref[client] = 1; } delete rs; delete db; } public void CheckFlagsMYSQL(int client) { char error[255]; Database db; if (SQL_CheckConfig("unloze_tracerpref")) { db = SQL_Connect("unloze_tracerpref", true, error, sizeof(error)); } if (db == null) { PrintToChat(client, "{green}[Unloze] {white}Error! Could not connect to MYSQL-DB!"); delete db; return; } char sSID[64]; GetClientAuthId(client, AuthId_Steam2, sSID, sizeof(sSID)); char sQuery[512]; Format(sQuery, sizeof(sQuery), "SELECT storestats FROM `unloze_zonepoints` WHERE `steam_id` = '%s'", sSID); DBResultSet rs; if ((rs = SQL_Query(db, sQuery)) == null) { delete db; delete rs; return; } if (rs.FetchRow()) { SQL_FetchString(rs, 0, g_cStorestats[client], sizeof(g_cStorestats)); } delete rs; delete db; } //---------------------------------------------------------------------------------------------------- // Purpose: stocks //---------------------------------------------------------------------------------------------------- public void DummyCallbackSimple(Handle hOwner, Handle hChild, const char[] err, DataPack pack1) { if (hOwner == null || hChild == null) { LogError("Query error. (%s)", err); } } stock bool IsValidClient(int client) { if (client > 0 && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client) && !IsFakeClient(client)) { return true; } return false; } stock void ClientCount() { g_iPlayerCount = 0; g_iPlayerCountTop10 = 0; for (int i = 1; i <= MaxClients; i++) { if (IsValidClient(i) && g_iTracerpref[i] == 0) { if (g_iPlayerRank[i] < 4 || g_bZeusOwner[i]) { g_iPlayerArrayTop10[g_iPlayerCountTop10++] = i; } g_iPlayerArray[g_iPlayerCount++] = i; } } } stock bool colorIndex(int colors[3], int a, int g, int b) { if (colors[0] == a && colors[1] == g && colors[2] == b) { return true; } return false; }