Pour ceux qui veulent voir le code pour le succès où on doit tuer un sniper avec sa flèche :
Code:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <achievements>
#define PLUGIN_VERSION "dev1"
new g_PlayerDeflected[MAXPLAYERS+1][2];
public Plugin:myinfo =
{
name = "Custom Achievements",
author = "Flyflo",
description = "Custom achievements",
version = PLUGIN_VERSION,
url = "http://www.geek-gaming.fr"
}
public OnPluginStart()
{
HookEvent("object_deflected", Event_PlayerDeflect);
HookEvent("player_death", Event_PlayerDeath);
}
public Action:Event_PlayerDeflect(Handle:event, const String:name[], bool:dontBroadcast)
{
new weaponid = GetEventInt(event, "weaponid");
if(weaponid == 60)
{
new deflecter = GetClientOfUserId(GetEventInt(event, "userid"));
new ownerid = GetClientOfUserId(GetEventInt(event, "ownerid"));
g_PlayerDeflected[deflecter][0] = 1;
g_PlayerDeflected[deflecter][1] = ownerid;
CreateTimer(3.0, Timer_ResetArrowDeflect, deflecter);
}
return Plugin_Continue;
}
public Action:Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
new victim = GetClientOfUserId(GetEventInt(event, "userid"));
new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
decl String:Weapon[64];
GetEventString(event, "weapon", Weapon, sizeof(Weapon));
if(StrContains(Weapon, "deflect_arrow", false) != -1)
{
if(g_PlayerDeflected[attacker][0] == 1)
{
if(g_PlayerDeflected[attacker][1] == victim)
{
//CA_ProcessAchievement
}
}
}
return Plugin_Continue;
}
public Action:Timer_ResetArrowDeflect(Handle:client, any:Tclient)
{
g_PlayerDeflected[Tclient][0] = 0;
}
Sinon j'en ai profité pour mettre à jour l'API:
Code:
#if defined _achievements_included
#endinput
#endif
#define _achievements_included
// iSpecialFlags
#define ACHIEVEMENT_CHEAT_ENABLED (1 << 0) //Achievement can progress/be achieved when sv_cheats = 1
#define ACHIEVEMENT_UNIQUE (1 << 1) //Achievement can be achieved by only one player
#define ACHIEVEMENT_NOTEXT (1 << 2) //Disable achievement text in chat
#define ACHIEVEMENT_NOPARTICLE (1 << 3) //Disable achievement particles
#define ACHIEVEMENT_NOSOUND (1 << 4) //Disable achievement sound
#define ACHIEVEMENT_SILENT ((1 << 2) | (1 << 3) | (1 << 4))
//
/**
* @brief Process an Achievement
*
* @param iAchievementId The Achievement ID
* @param hClient The target client
* @param iAddProgress Progress Amount (default 1)
* @param iSpecialFlags Specified above
* @noreturn
*/
native CA_ProcessAchievement(iAchievementId, hClient, iAddProgress = 1, iSpecialFlags = 0);
/**
* @brief Retrieve the progress of an Achievement
*
* @param iAchievementId The Achievement ID
* @param hClient The target client
* @return The progress, -1 on error
*/
native CA_GetAchievementProgress(iAchievementId, hClient);
/**
* @brief Says if a Client achieved the specified Achievement
*
* @param iAchievementId The Achievement ID
* @param hClient The target client
* @return 1 if achieved, 0 if not, -1 on error
*/
native CA_IsAchievedByClient(iAchievementId, hClient);
/**
* Called whenever a client triggers an Achievement
*
* @param iAchievementId The Achievement ID
* @param hClient The target client
* @param iSpecialFlags Flags used
* @noreturn
*/
forward AchievementTriggered(iAchievementId, iClient, iSpecialFlags);
Je la mettrai en place ce soir.
Maintenant pour un succès simple vous avez juste à faire:
Code:
CA_ProcessAchievement(1, client);
Si vous voulez ajouter 2 points d'un coup:
Code:
CA_ProcessAchievement(1, client, 2);
Un achievement unique:
Code:
CA_ProcessAchievement(1, client, 1, ACHIEVEMENT_UNIQUE);
Un achievement unique déclenchable même si sv_cheats = 1:
Code:
CA_ProcessAchievement(1, client, 1, ACHIEVEMENT_UNIQUE|ACHIEVEMENT_CHEAT_ENABLED);
etc...