|
@@ -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);
|
|
|
+}
|