Browse Source

Ensured only non-bots can get achievements

Seems to fix potential crashes.

Also made a SQL_ExecuteStatement that returns a statement as a result
set.
nosoop 7 years ago
parent
commit
bae5dd4822
1 changed files with 22 additions and 10 deletions
  1. 22 10
      scripting/custom_achievements.sp

+ 22 - 10
scripting/custom_achievements.sp

@@ -13,7 +13,7 @@
 #include <stocksoup/log_server>
 #include <stocksoup/tf/tempents_stocks>
 
-#define PLUGIN_VERSION "0.1.1"
+#define PLUGIN_VERSION "0.1.2"
 public Plugin myinfo = {
 	name = "[CSRD] Custom Achievements",
 	author = "nosoop",
@@ -107,18 +107,18 @@ public int Native_RegisterAchievement(Handle hPlugin, int argc) {
 	
 	// Attempt to fetch achievement first, creating it if it doesn't exist.
 	g_QueryGetAchievementIdentifier.BindString(0, internalName, false);
-	SQL_Execute(g_QueryGetAchievementIdentifier);
+	DBResultSet achievementResults = SQL_ExecuteStatement(g_QueryGetAchievementIdentifier);
 	
 	int iAchievement;
-	if (SQL_FetchRow(g_QueryGetAchievementIdentifier)) {
-		iAchievement = SQL_FetchInt(g_QueryGetAchievementIdentifier, 0);
+	if (achievementResults.FetchRow()) {
+		iAchievement = achievementResults.FetchInt(0);
 	} else {
 		g_QueryRegisterAchievement.BindString(0, internalName, false);
 		g_QueryRegisterAchievement.BindInt(1, achievementStyle, false);
 		
-		SQL_Execute(g_QueryRegisterAchievement);
+		DBResultSet registerResults = SQL_ExecuteStatement(g_QueryRegisterAchievement);
 		
-		iAchievement = SQL_GetInsertId(g_QueryRegisterAchievement);
+		iAchievement = registerResults.InsertId;
 	}
 	
 	LogDebug("Achievement '%s' registered under identifier %d", internalName, iAchievement);
@@ -438,6 +438,7 @@ void TransmitAchievementEffects(int recipient) {
 		if (recipientTeam != TFTeam_Unassigned && recipientTeam != TFTeam_Spectator) {
 			EmitGameSoundToAll("Achievement.Earned", recipient);
 			
+			// TODO prevent custom models from allowing this?
 			if (IsPlayerAlive(recipient)) {
 				TE_SetupTFParticleEffect("achieved", NULL_VECTOR, NULL_VECTOR, NULL_VECTOR,
 						recipient, PATTACH_POINT_FOLLOW, ATTACHMENT_HEAD);
@@ -451,10 +452,12 @@ void TransmitAchievementEffects(int recipient) {
  * Returns a client with the specified Steam account ID, or 0 if none.
  */
 stock int FindClientByAccountID(int steamid3) {
-	for (int i = 1; i <= MaxClients; i++) {
-		if (!IsFakeClient(i) && IsClientAuthorized(i)) {
-			if (steamid3 == GetSteamAccountID(i)) {
-				return i;
+	if (steamid3) {
+		for (int i = 1; i <= MaxClients; i++) {
+			if (IsClientConnected(i) && !IsFakeClient(i) && IsClientAuthorized(i)) {
+				if (steamid3 == GetSteamAccountID(i)) {
+					return i;
+				}
 			}
 		}
 	}
@@ -513,3 +516,12 @@ void LogDebug(const char[] format, any ...) {
 		LogServer(message);
 	}
 }
+
+/**
+ * Executes a prepared statement and returns it as a result set view.
+ * The handle should not be closed.
+ */
+DBResultSet SQL_ExecuteStatement(DBStatement query) {
+	SQL_Execute(query);
+	return view_as<DBResultSet>(query);
+}