• Страница 1 из 1
  • 1
Проблема с передачей значений через натив.
Дата: Вторник, 25.09.2018, 22:02 | Сообщение # 1
Любитель
Offline
  • Gordon200
  • Репутация: 0
  • Сообщений:25
  • Пользователь
  • Статус пользователя Собираю паблик на минимальных плагинах.
Пытался через натив передать "деньги" (золото, серебро), но в главном плагине всё работает шикарно, а вот в дополнительном (магазин) показывает мол денег вообще 0.[spoiler=Плагин A (основной)]
Код
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
//#include <amxmisc>
#include <nvault>

#define PLUGIN "MiniMoneySystem"
#define VERSION "None"
#define AUTHOR "Pir"

const m_LastHitGroup = 75

new Damage[33], HeadKills[33]
new i_Gold[33], i_Silver[33]
new g_vault

public plugin_init() {
   register_plugin(PLUGIN, VERSION, AUTHOR)
   RegisterHam(Ham_Killed, "player", "Fw_PostKilled", 0)
   RegisterHam(Ham_Killed, "player", "Fw_PreKilled", 1)
   RegisterHam(Ham_TakeDamage, "player", "Fw_PostTakeDamage", 0)
   RegisterHam(Ham_TakeDamage, "player", "Fw_PreTakeDamage", 1)
   register_clcmd("say /mm", "Test")
   
   g_vault = nvault_open("Money_System");
}

public plugin_natives()
{
   register_native("get_gold", "_get_gold")
   register_native("get_silver", "_get_silver")
   
   register_native("set_gold", "_set_gold")
   register_native("set_silver", "_set_silver")
}

public _get_gold(id)
{
   return i_Gold
[id]}

public _get_silver(id)
{
   return i_Silver
[id]}

public _set_gold(id, amount)
{
   i_Gold [id]= amount
}

public _set_silver(id, amount)
{
   i_Silver [id]= amount
}

public Test(id)
{
   client_print_color(id, print_team_default, "^3 [TEST]Золота: %d", i_Gold[id])
   client_print_color(id, print_team_default, "^3 [TEST]Серебра: %d", i_Silver[id])
   client_print_color(id, print_team_default, "^3 [TEST]Урона: %d", Damage[id])
}

public client_disconnected(id)
{
   if(!is_user_bot(id))
   {
      SaveData(id)
   }
}

public plugin_end()
{
   nvault_close(g_vault)
}
   

public client_connect(id)
{
   if(!is_user_bot(id))
   {
      Damage [id]= 0
      LoadData(id)
   }
}

public Fw_PostTakeDamage(victim, inflictor, attacker, Float: flDamage)
{
   if(!is_user_alive(attacker))
      return HAM_HANDLED;
      
   Damage [attacker]+= floatround(flDamage)
   
   /*if(Damage [attacker]=> 1000)
   {
      i_Silver [attacker]+= 1
      
      Damage [attacker]= 0
   }*/
   
   return HAM_IGNORED
}

public Fw_PreTakeDamage(victim, inflictor, attacker, Float: flDamage)
{
   if(Damage [attacker]>= 1000)
   {
      i_Silver [attacker]+= 1
      
      Damage [attacker]= 0
   }
}

public Fw_PostKilled (Victim, Attacker, corpse)
{
   if(!is_user_alive(Attacker))
      return HAM_HANDLED
   
   if(get_pdata_int(Victim, m_LastHitGroup, 5) == HIT_HEAD)
   {
      HeadKills[Attacker]++
      
      if(HeadKills [Attacker]>= 2)
      {
         i_Gold [Attacker]+= 1
      }
   }
   return HAM_IGNORED
}

public Fw_PreKilled (Victim, Attacker, corpse)
{
   if(HeadKills [Attacker]>= 2)
   {
      i_Gold [Attacker]+= 1
   }
   return HAM_IGNORED
}

public SaveData(id)
{
   new AuthID[35]
   get_user_authid(id, AuthID, 34)
   
   new vaultkey[64], vaultdata[256]
   format(vaultkey, 63, "%s-user", AuthID)
   format(vaultdata, 255, "%i#%i#", i_Gold[id], i_Silver[id])
   nvault_set(g_vault, vaultkey, vaultdata)
   
   return PLUGIN_CONTINUE
}

public LoadData(id)
{
   new AuthID[35]
   get_user_authid(id, AuthID, 34)
   
   new vaultkey[64], vaultdata[256]
   format(vaultkey, 63, "%s-user", AuthID)
   format(vaultdata, 255, "%i#%i#", i_Gold[id], i_Silver[id])
   nvault_get(g_vault, vaultkey, vaultdata, 255)
   
   replace_all(vaultdata, 255, "#", " ")
   
   new Gold[32], Silver[32]
   
   parse(vaultdata, Gold, 31, Silver, 31)
   
   i_Gold [id]= str_to_num(Gold)
   i_Silver [id]= str_to_num(Silver)
   
   return PLUGIN_CONTINUE
}
[/spoiler]
Код
В плагине магазине (Плагин B) подключил:
#include csdm_inc

Сделал проверку через команду

register_clcmd("say /gold", "gold")

Сделал функцию для команды:

public gold(id)
{
   client_print_color(id, print_team_default, "^3[^4DSJA^3]^1 Gold: %d, Silver: %d", get_gold(id), get_silver(id))
}


В итоге в плагине B показывает 0 и 0, а в главном реальную цифру.
Инклюд в котором прописаны нативы -
Дата: Вторник, 25.09.2018, 22:46 | Сообщение # 2
Скриптер
Мастер
Offline
  • MakapoH
  • Репутация: 71
  • Сообщений:140
  • Разработчик
Потому что нативы не получают информацию wink
Чтобы получить какой-то параметр, используется get_param(номер аргумента), get_array и т.д. Всё это есть в стандартном инклуде...

public _set_silver(id, amount)
Ну не получает он так информацию... Всё что здесь указано, это бесполезные переменные, которые передают совершенно другую информацию. А именно первый аргумент передаёт айди ПЛАГИНА, а второй передаёт количество аргументов. Больше никаких параметров там быть не может.

В твоём случае нужно сделать так:
1) return i_Silver[get_param(1)]
2) i_Gold[get_param(1)] = get_param(2)

P.S Смотрите хоть примеры в других плагинах у старых-добрых-опытных скриптёров, а не у новичков.
Сообщение отредактировал MakapoH - Вторник, 25.09.2018, 23:02
Дата: Среда, 26.09.2018, 08:29 | Сообщение # 3
Любитель
Offline
  • Gordon200
  • Репутация: 0
  • Сообщений:25
  • Пользователь
  • Статус пользователя Собираю паблик на минимальных плагинах.
Цитата MakapoH ()
P.S Смотрите хоть примеры в других плагинах у старых-добрых-опытных скриптёров, а не у новичков.
Спасибо +реп)
  • Страница 1 из 1
  • 1
Поиск:
(threadpage)