|
Форум Counter-Strike 1.6 Сервер Counter-Strike 1.6 Помощь по скриптингу Проблема с передачей значений через натив. |
Проблема с передачей значений через натив. |
Дата: Вторник, 25.09.2018, 22:02 | Сообщение # 1
Любитель
Offline
![]()
Пытался через натив передать "деньги" (золото, серебро), но в главном плагине всё работает шикарно, а вот в дополнительном (магазин) показывает мол денег вообще 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 } Код В плагине магазине (Плагин 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
![]()
Потому что нативы не получают информацию
![]() Чтобы получить какой-то параметр, используется 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
|
| |||
| |||