Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Сохранение и чтение данных
IIPO100_HY6 Дата: Среда, 01.01.2014, 17:47:02 | Сообщение # 1
Сообщений: 10
Репутация: 1 [ +/- ]
Начал изучать соурсмод. Хочу создать небольшой плагин для своего сервера L4D2 типа Item Buy System но чтобы данные сохранялись и читались ну например зашёл игрок первый самый создался файл l4d_bm_stats.txt и в нём записан СтимИд и количество очков. Когда заходят другие игроки уже если файл есть то просто добавляются их СтимИд если нету но если в файле находит СтимИд только что зашедшего игрока то читает количество очков. Проще говоря: сохраняем стимид игрока и количество его поинтов, когда он заходит читаем. Как реализовать?Знаю что нужно через кейвалюэс но не умею ими пользоваться и нашёл пока только как читать и то нифига не понял pipec


Сообщение отредактировал IIPO100_HY6 - Среда, 01.01.2014, 17:48:35
 
BeatMaker_R1KO_ Дата: Среда, 01.01.2014, 18:43:12 | Сообщение # 2
Сообщений: 60
Репутация: 0 [ +/- ]
http://world-source.ru/forum/100-2292-1
А еще лучше через sql базу
 
«SeReGa»☆ Дата: Среда, 01.01.2014, 18:44:44 | Сообщение # 3
Сообщений: 395
Репутация: 37 [ +/- ]
Зачем писать всё заново (даж если умений нет) попробуй установить rankMe
 
IIPO100_HY6 Дата: Среда, 01.01.2014, 19:09:37 | Сообщение # 4
Сообщений: 10
Репутация: 1 [ +/- ]
BeatMaker_R1KO_ спс
 
BeatMaker_R1KO_ Дата: Среда, 01.01.2014, 19:44:51 | Сообщение # 5
Сообщений: 60
Репутация: 0 [ +/- ]
Цитата «SeReGa»☆ ()
Зачем писать всё заново (даж если умений нет) попробуй установить rankMe

Это ему нужно для изучения sp, а не для написания плагина
 
IIPO100_HY6 Дата: Пятница, 03.01.2014, 09:38:07 | Сообщение # 6
Сообщений: 10
Репутация: 1 [ +/- ]
Я брал кой чё из примера на сайте чёто из вики по этой теме в итоге получилось это:

Код
#include <sourcemod>
#include <sdktools>

#define PLUGIN_VERSION "0.1"

new points[MAXPLAYERS+1];
new Handle:kv;
new String:g_SteamID[MAXPLAYERS+1];

public Plugin:myinfo =       
{

name = "Special Modification",
author = "IIpo100 Hy6",
description = "Make specmodifications for server",
version = PLUGIN_VERSION,
url = ""

}

public OnPluginStart()
{
RegConsoleCmd("sm_bm_menu",CMD_showmenu);

kv = CreateKeyValues("wS_Group");       
FileToKeyValues(kv, "stats.txt");

HookEvent("player_death", player_death);
}

public OnClientConnected(client)
{        
               
        GetClientAuthString(client, g_SteamID[client], 30);
              
        if (KvJumpToKey(kv, g_SteamID[client], false))
        {
         points[client] = KvGetNum(kv, "points");
        PrintToChatAll("Игрок:{red} %N[=%s=] присоединился к игре с %d поинтами.", client, g_SteamID[client], points[client])
         }
        else
        {
        points[client] = 0;

        KvJumpToKey(kv, g_SteamID[client], true);
        KvSetNum(kv, "points", 0);
        PrintToChatAll("Новый игрок:{red} %N[=%s=] присоединился к игре с 0 поинтами.", client, g_SteamID[client])
        }
              
        KvRewind(kv);

}

public Action:CMD_showmenu(client, args)       
{       
            if (client > 0 && args < 1) ShowMyPanel(client);       
            return Plugin_Handled;       
}       

public player_death(Handle:event, const String:name[], bool:dontBroadcast)
{
       new killer = GetClientOfUserId(GetEventInt(event, "attacker"));
       if (killer < 1 || IsFakeClient(killer))
        return;

       new victim = GetClientOfUserId(GetEventInt(event, "userid"));
       if (GetClientTeam(killer) == GetClientTeam(victim))
        return;

       points[killer]++;
       PrintToChatAll("Игрок:{red} %N получил поинт.Теперь количество его поинтов: %d.", killer, points[killer])

}

ShowMyPanel(client)       
{
            new Handle:menu_panel = CreatePanel();       
            SetPanelTitle(menu_panel, "Покупка:\n \n");       
            DrawPanelItem(menu_panel, "Помповый дробовик");       
            DrawPanelItem(menu_panel, "Граната");       
            DrawPanelItem(menu_panel, "Молотов");       
            DrawPanelItem(menu_panel, "Охотничье ружьё");       
            DrawPanelItem(menu_panel, "Автомат \n \n");       
            DrawPanelItem(menu_panel, "Выход");       
            SendPanelToClient(menu_panel, client, Select_Panel, 0);       
            CloseHandle(menu_panel);       
}

public Select_Panel(Handle:menu_panel, MenuAction:action, client, menu_option)       
{
            if (action == MenuAction_Select)       
            {
            new flags1;
          flags1 = GetCommandFlags("give");
                
             SetCommandFlags("give", flags1 & ~FCVAR_CHEAT);
                
                switch (menu_option)
          {
                   case 1:
          {
             FakeClientCommand(client, "give pumpshotgun");
          }
                
          case 2:
          {
                FakeClientCommand(client, "give pipe_bomb");
          }
                
          case 3:
          {
                FakeClientCommand(client, "give molotov");
          }
                
          case 4:
          {
                FakeClientCommand(client, "give hunting_rifle");
          }
                
          case 5:
          {
                FakeClientCommand(client, "give rifle");
          }
          }
            }
}

public OnMapEnd()
{
       SaveStats();
}

public OnPluginEnd()
{
       SaveStats();
}

public OnClientDisconnect(client)
{
          GetClientAuthString(client, g_SteamID[client], 30);
             
          KvJumpToKey(kv, g_SteamID[client], true);
       KvSetNum(kv, "points", points[client]);
       KvRewind(kv);
              
       SaveStats()

}

SaveStats()
{
KeyValuesToFile(kv, "stats.txt");
}


НО! Одна проблема: при смене карты поинты сбрасываются чтоли, а при выключении сервера stats.txt становится пустым. В чём проблема?

Добавлено (02.01.2014, 15:38:16)
---------------------------------------------
Ага я выяснил что если скопировать файл и перед запуском серва переименовать в нужный то счёт не собьётся но когда зайдёт игрок и убьёт кого нибудь ему напишет что у него 1 поинт хотя в файле было 3 (

Добавлено (02.01.2014, 17:36:10)
---------------------------------------------
Понял в чём проблема: когда случайный игрок зашёл на сервер было написано Игрок ник[=bbot=] присоединился к игре с 0 поинтами то есть его не смогло инициализировать...и как быть?

Добавлено (02.01.2014, 18:57:53)
---------------------------------------------
Ага вот как сделал:

Код
#include <sourcemod>
#include <sdktools>

#define PLUGIN_VERSION "0.1"

new String:points[MAXPLAYERS+1];
new Handle:kv;
new String:g_SteamID[MAXPLAYERS+1];

public Plugin:myinfo =   
{

name = "Special Modification",
author = "IIpo100 Hy6",
description = "Make specmodifications for server",
version = PLUGIN_VERSION,
url = ""

}

public OnPluginStart()
{
RegConsoleCmd("sm_bm_menu",CMD_showmenu);

RegConsoleCmd("sm_bm_points",CMD_showpoints);

kv = CreateKeyValues("wS_Group");   

FileToKeyValues(kv, "stats.txt");

HookEvent("player_death", player_death);
HookEvent("player_spawn", player_spawn);
HookEvent("server_shutdown", server_shutdown);
}

public Action: player_spawn(Handle:event, const String:name[], bool:dontBroadcast)
{    
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
      
    GetClientAuthString(client, g_SteamID[client], 30);
      
    if (KvJumpToKey(kv, g_SteamID[client], false))
    {
       points[client] = KvGetNum(kv, "points");
    PrintToChatAll("Игрок: %N[=%s=] присоединился к игре с %d поинтами.", client, g_SteamID[client], points[client]);
    }
    else
    {
        points[client] = 0;
    KvJumpToKey(kv, g_SteamID[client], true);
    KvSetNum(kv, "points", 0);
    PrintToChatAll("Новый игрок: %N[=%s=] присоединился к игре.", client, g_SteamID[client]);
    }
      
       
    KvRewind(kv);

}

public Action:CMD_showmenu(client, args)   
{   
        if (client > 0 && args < 1) ShowMyPanel(client);   
        return Plugin_Handled;   
}   

public Action:CMD_showpoints(client, args)   
{   
        if (client > 0 && args < 1) PrintToChat(client,"У вас %d поинтов.", points[client]);   
        return Plugin_Handled;   
}   

public player_death(Handle:event, const String:name[], bool:dontBroadcast)
{

   new killer = GetClientOfUserId(GetEventInt(event, "attacker"));
   if (killer < 1 || IsFakeClient(killer))
    return;

   new victim = GetClientOfUserId(GetEventInt(event, "userid"));
   if (GetClientTeam(killer) == GetClientTeam(victim))
    return;

   points[killer]++;
   PrintToChatAll("Игрок: %N получил поинт.Теперь количество его поинтов: %d.", killer, points[killer]);
}

ShowMyPanel(client)   
{
        new Handle:menu_panel = CreatePanel();   
        SetPanelTitle(menu_panel, "Покупка:\n \n");   
        DrawPanelItem(menu_panel, "Помповый дробовик");   
        DrawPanelItem(menu_panel, "Граната");   
        DrawPanelItem(menu_panel, "Молотов");   
        DrawPanelItem(menu_panel, "Охотничье ружьё");   
        DrawPanelItem(menu_panel, "Автомат \n \n");   
        DrawPanelItem(menu_panel, "Выход");   
        SendPanelToClient(menu_panel, client, Select_Panel, 0);   
        CloseHandle(menu_panel);   
}

public Select_Panel(Handle:menu_panel, MenuAction:action, client, menu_option)   
{
        if (action == MenuAction_Select)   
        {
        new flags1;
      flags1 = GetCommandFlags("give");
        
      SetCommandFlags("give", flags1 & ~FCVAR_CHEAT);
        
            switch (menu_option)
            {
               case 1:
      {
         FakeClientCommand(client, "give pumpshotgun");
      }
        
      case 2:
      {
            FakeClientCommand(client, "give pipe_bomb");
      }
        
      case 3:
      {
            FakeClientCommand(client, "give molotov");
      }
        
      case 4:
      {
            FakeClientCommand(client, "give hunting_rifle");
      }
        
      case 5:
      {
            FakeClientCommand(client, "give rifle");
      }
      }
        }
}

public OnMapEnd()
{
     SaveStats();
}

public OnPluginEnd()
{
     SaveStats();
}

public Action: server_shutdown(Handle:event, const String:name[], bool:dontBroadcast)
{
     CloseHandle(kv);
}

public OnClientDisconnect(client)
{
      GetClientAuthString(client, g_SteamID[client], 30);
     
      KvJumpToKey(kv, g_SteamID[client], true);
      KvSetNum(kv, "points", points[client]);
      KvRewind(kv);
      
   SaveStats();

}

SaveStats()
{
KeyValuesToFile(kv, "stats.txt");
}

но осталась одна проблема: при смене карты и перезаходе игрока всё нормально, но при выключении сервера файл stats.txt становится пустым (

Добавлено (03.01.2014, 09:38:07)
---------------------------------------------
Как говорится сам спросил сам ответил) Переделал сохранение файла в cfg/ и погуглил была тема про баны которые очищаются после выключения сервера:

Цитата
Everytime when server shutdown, "memory" is cleared, all bans disappear.

writeid & writeip commands save all current permanent bans from server "memory" to config files banned_user.cfg & banned_ip.cfg
If you use these commands first when launch server, it will wipe out ban files B E C A U S E there are no bans in server "memory" !

So always, execute config files first, fill "memory" with bans, before write them back.
Код

// Right ORDER!!!
exec banned_user.cfg
exec banned_ip.cfg
writeid
writeip




то есть всё хранится в памяти сервера а после выключения очищается. Чтобы сохранить нужно добавить exec файл. Я дописал в server.cfg: exec stats.txt и теперь всё в порядке ) тема закрыта!


Сообщение отредактировал IIPO100_HY6 - Пятница, 03.01.2014, 09:38:52
 
  • Страница 1 из 1
  • 1
Поиск: