Добро пожаловать в наше сообщество TopForo.ru

Станьте частью чего-то великого, присоединяйтесь сегодня!

  • Автоматическая публикация тем

    Автоматическая публикация тем

    Новые темы в данном разделе создаются автоматически при загрузке файла в Менеджер ресурсов.

    Ручное создание тем недоступно.

    Безопасность вложений

    Все загружаемые файлы проходят обязательную проверку на наличие вредоносного кода с использованием VirusTotal — надежного инструмента для обеспечения безопасности.

Инструкция КАК: Создать пользовательское достижение (плюс фрагмент веб-статистики!)

Статус
В этой теме нельзя размещать новые ответы.
  • Последнее редактирование:
  • Автор темы
Последнее редактирование:
ПРИМЕЧАНИЕ: важно понимать, что в этом руководстве предполагается, что вы знаете основы Pawn (синтаксис и его реализацию в AMXX). Вы должны быть программистом как минимум среднего уровня, имеющим хотя бы базовые знания об API.

Следующие фрагменты кода только прокомментированы, хорошо прокомментированы, но для тех, кто ничего не понимает, лучше всего просто позволить кому-то другому выполнить эту работу. Отправьте запрос на форум запросов, вместо того чтобы разбираться с этим API.

Чтобы получить несколько достижений в одном плагине, обратитесь к примеру achievement_example.sma в основной ветке.

achievement_grenade_kills:
Достижение, которое подсчитывает количество убийств с помощью гранат, и когда достигается максимальное значение (цель), клиент получает награду за выполнение достижения.
Код:
Expand Collapse Copy
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.)
    }
}
Теперь для фрагмента Webstats. Это было сделано быстро и, возможно, не оптимизировано наилучшим образом, однако это работает как пример.
ПРИМЕЧАНИЕ: Фрагмент очень простой; просто данные, полученные с помощью SQL и помещенные в таблицу. Использует дизайн таблицы, как показано в achievement_motd . Информация о достижениях (в массиве) должна быть отсортирована в алфавитном порядке для корректной работы (сначала имеются в виду цифры, затем a, b, c и т.д.).
PHP:
Expand Collapse Copy
<?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>";

?>
И HTML-файл для ввода идентификатора steamid:
PHP:
Expand Collapse Copy
<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>
Achievements API - простой способ для вас создавать свои СОБСТВЕННЫЕ достижения!
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Назад
Сверху Снизу