Последнее редактирование:
ПРИМЕЧАНИЕ: важно понимать, что в этом руководстве предполагается, что вы знаете основы Pawn (синтаксис и его реализацию в AMXX). Вы должны быть программистом как минимум среднего уровня, имеющим хотя бы базовые знания об API.
Следующие фрагменты кода только прокомментированы, хорошо прокомментированы, но для тех, кто ничего не понимает, лучше всего просто позволить кому-то другому выполнить эту работу. Отправьте запрос на форум запросов, вместо того чтобы разбираться с этим API.
Чтобы получить несколько достижений в одном плагине, обратитесь к примеру achievement_example.sma в основной ветке.
achievement_grenade_kills:
Достижение, которое подсчитывает количество убийств с помощью гранат, и когда достигается максимальное значение (цель), клиент получает награду за выполнение достижения.
Теперь для фрагмента Webstats. Это было сделано быстро и, возможно, не оптимизировано наилучшим образом, однако это работает как пример.
ПРИМЕЧАНИЕ: Фрагмент очень простой; просто данные, полученные с помощью SQL и помещенные в таблицу. Использует дизайн таблицы, как показано в achievement_motd . Информация о достижениях (в массиве) должна быть отсортирована в алфавитном порядке для корректной работы (сначала имеются в виду цифры, затем a, b, c и т.д.).
И HTML-файл для ввода идентификатора steamid:
Achievements API - простой способ для вас создавать свои СОБСТВЕННЫЕ достижения!
Следующие фрагменты кода только прокомментированы, хорошо прокомментированы, но для тех, кто ничего не понимает, лучше всего просто позволить кому-то другому выполнить эту работу. Отправьте запрос на форум запросов, вместо того чтобы разбираться с этим API.
Чтобы получить несколько достижений в одном плагине, обратитесь к примеру achievement_example.sma в основной ветке.
achievement_grenade_kills:
Достижение, которое подсчитывает количество убийств с помощью гранат, и когда достигается максимальное значение (цель), клиент получает награду за выполнение достижения.
Код:
const
// объявление максимального размера клиента
#include < achievement_api >
#include < csx >
#include < amxmodx >
// включает в себя, конечно... MaxClients = 32; // максимальное количество символов steamid
const MaxSteamIdChars = 35; // случайное число для set_task
const TaskIdDelayConnect = 3799; // чтобы упростить получение данных о достижениях, мы делаем перечисление; делая его "структурой"
enum _:AchievementDataStruct { _Name[ MaxClients ], // название достижения _Description[ 256 ], // описание достижения (не может превышать 255 символов - ограничение, установленное в api) _Save_Name[ MaxClients ], // ключ сохранения достижения _Max_Value // и, наконец, максимальное значение (также называемое целевым значением в других плагинах достижений)
}; // массив, построенный из структуры
new const AchievementInfo[ AchievementDataStruct ] =
{
"Grenade Kills", // название достижения
"Убить врага гранатой 50 раз", // описание достижения (не может превышать 255 символов - ограничение, установленное в api)
"progress_grenade", // ключ сохранения достижения
50 // и, наконец, максимальное значение (также называемое целевым значением в других плагинах достижений)
}; // создайте переменную
новый указатель достижений; новый
// const MaxSteamIdChars = 35;
// const MaxClients = 32;
// 33 ячейки (для 32 пользователей) и 35 ячеек (для steamid)
// переменная для хранения steamid клиента
// эта переменная будет содержать уникальный индекс, который имеет достижение в API, позволяя вам использовать его для извлечения данных SteamID[ MaxClients + 1 ][ MaxSteamIdChars ]; // наш счетчик целей будет содержать текущие убийства клиента
// 33 ячейки (для всех 32 пользователей)
новых GrenadeKills[ MaxClients + 1 ]; // переменная, содержащая максимальное количество игроков (не максимальное количество слотов)
новых MaxPlayers; public plugin_init( ) // не требует пояснений
{
// плагин регистрации
register_plugin( "Achievement API: Grenade Kills", "0.0.1", "Xellath" ) ; // зарегистрируйте достижение в api
// в порядке: Имя достижения, Описание, Ключ сохранения и максимальное значение AchievementPointer = RegisterAchievement( AchievementInfo[ _Name ], AchievementInfo[ _Description ], AchievementInfo[ _Save_Name ], AchievementInfo[ _Max_Value ] ); // вернет индекс достижения (сохраненный в AchievementPointer)
// назначит максимальное количество игроков (не максимальное слоты) MaxPlayers = get_maxplayers( ); // достижение теперь зарегистрировано в API, давайте начнем с убийства гранатой
}
public client_connect( Клиента ) // вызывается, когда клиент подключается
{
// установить 10 сек задач, чтобы проверить, если пользователь завершил или данных для достижения
set_task( 10.0, "TaskDelayConnect", клиент + TaskIdDelayConnect ); }
общественного TaskDelayConnect( ресурсы taskid )
{
// наш идентификатор клиента (клиента) = (Идентификатор_задачи - TaskIdDelayConnect (3799))
новый клиент = Идентификатор_задачи - TaskIdDelayConnect; // получить steamid клиента
get_user_authid( клиент, SteamId[ клиент ], charsmax( SteamId ) ); // проверить, если у нашего клиента есть объективные данные GrenadeKills[ клиент ] = GetAchievementData( SteamId[ клиент ] /* наш ключ */, AchievementInfo[ _Save_Name ] /* сохранить имя для достижения результатов (объявлены в массиве) */ ); // проверяем, если клиент уже завершены достижением
, если( GetClientAchievementStatus( AchievementPointer, GrenadeKills[ клиент ] ) == _In_Progress )
{
// достижения не завершено
// сохранение объективных данных клиентам steamid SetAchievementData( SteamId[ клиент ] /* наш ключ */, AchievementInfo[ _Save_Name ] /* сохранить имя достижения */, GrenadeKills[ клиент ] /* данные */ ); }
еще //если( GetClientAchievementStatus( AchievementPointer, соединения[ клиент ] ) == _Unlocked )
{
// клиент завершал уже достижение
// send completed to api, but don't announce (or else every client would get all achievements everytime the connect)
ClientAchievementCompleted( Client, AchievementPointer, .Announce = false );
}
// remove task
remove_task( Client + TaskIdDelayConnect );
}
public client_disconnect( Client )
{
// reset variable in case played indexes are magically switched and another client gets another set of connections
GrenadeKills[ Client ] = 0;
}
public client_death( Killer, Victim, WeaponIndex, Hitplace, TeamKill ) // called when a client dies
{
// check whether victim and killer are actual players (index above or equal 1 but lower or equal to 32)
if( 1 <= Victim <= MaxPlayers
&& 1 <= Killer <= MaxPlayers )
{
// victim did not kill himself
if( Victim != Killer )
{
// was the weapon a hegrenade?
if( WeaponIndex == CSW_HEGRENADE )
{
// yes it was
// check if client has unlocked the achievement
if( GetClientAchievementStatus( AchievementPointer, GrenadeKills[ Killer ] ) == _In_Progress )
{
// increment the objective value
GrenadeKills[ Killer ]++;
// save data
SetAchievementData( SteamId[ Killer ] /* our key */, AchievementInfo[ _Save_Name ] /* save name for achievement */, GrenadeKills[ Killer ] /* data */ );
// check if client just unlocked the achievement
if( GetClientAchievementStatus( AchievementPointer, GrenadeKills[ Killer ] ) == _In_Progress )
{
// client unlocked the achievement
// send completed to api, and announce
ClientAchievementCompleted( Killer, AchievementPointer, .Announce = true ); // true is default, but just to clarify
// the forward below is now called, so to award extra stuff, do something in the forward
}
}
}
}
}
}
public Forward_ClientEarnedAchievement( const AchiPointer, const Client ) // called when client earned the achievement
{
if( AchiPointer == AchievementPointer )
{
// this forward can be used to reward people stuff
// perhaps a model or just something extra (like ie. cash from cashmod, pointsystem etc.)
}
}
ПРИМЕЧАНИЕ: Фрагмент очень простой; просто данные, полученные с помощью SQL и помещенные в таблицу. Использует дизайн таблицы, как показано в achievement_motd . Информация о достижениях (в массиве) должна быть отсортирована в алфавитном порядке для корректной работы (сначала имеются в виду цифры, затем a, b, c и т.д.).
PHP:
<?php
// multi-dimensional array holding info for achievements
$data = array
(
0=>array
(
"1337", // achievement name
"Be online at 13:37", // description
1 // objective value (value set at completion)
),
1=>array
(
"Addict",
"Connect 500 times",
500
)
);
// mysql initzializing variables
$hostname = "localhost";
$username = "root";
$password = "pass";
$database = "achievement_api";
// connect to mysql
$connection = mysql_connect( $hostname, $username, $password );
if( !$connection )
{
// could not connect; throw error
die( 'Could not connect: ' . mysql_error( ) );
}
// check if steamid was entered
$steamid = $_GET['steamid'];
if( !$steamid )
{
// no steamid; throw error
die( 'No steamid entered!' );
}
// html body / style
echo "<html>";
echo "<style>";
echo "body{margin:0;padding:0;font-family:Tahoma,Helvetica,Arial,sans-serif;}table,tr,td{align:center;color:#222;background:#fff;margin:1;padding:1;border:solid #eee 1px;}";
echo "</style>";
echo "<body>";
// table (for the sake of simplicity)
echo "<table width=600>";
echo "<tr><td><b>Achievement Name</b></td><td><b>Description</b></td><td><b>Earned</b></td></tr>";
// select database in sql
mysql_select_db( $database, $connection );
// make the query
$query = "SELECT `data`, `key2` FROM `achievement_api_ex` WHERE `key1` = '$steamid';";
// send query
$result = mysql_query( $query, $connection );
// check if query picked up any data
if( !$result )
{
// no data found
die( 'No data found!' );
}
// achievement counter
$achievement = 0;
// achievements earned
$achievements = 0;
// fetch data from query
while( $row = mysql_fetch_array( $result ) )
{
// convert data to an int
$number = (int)$row['data'];
// check if data is more or equal to the max value (assigned in multi-dimensional array above)
$earned = ( ( $number >= $data[$achievement][2] ) ? "Yes" : "No" ); // "Yes" if more or equal, otherwise "No"
// check if client has earned
if( $earned == "Yes" )
{
$achievements++;
}
// print the data into the table
echo "<tr><td>". $data[$achievement][0] ."</td><td>" . $data[$achievement][1] . "</td><td>" . $earned . "</td></tr>";
// increment the achievement variable
$achievement++;
}
// total achievements earned
echo "Achievements Earned: " . $achievements ."<br>";
echo "Max Achievements: " . $achievement . "";
// close
echo "</table>";
echo "</body>";
?>
PHP:
<html>
<body>
<!-- Make them enter a steamid and send them to php script with steamid = input -->
<form action="web_stats_example.php" method="get">
Steam ID: <input type="text" name="steamid" />
<input type="submit" />
</form>
</body>
</html>