Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

ZP Donate Ammo Packs ( лимит доната )

, 20 Аммо за раунд
Статус пользователя Aikido
сообщение 11.2.2014, 16:11
Сообщение #1


Стаж: 12 лет

Сообщений: 287
Благодарностей: 326
Полезность: 1102

Меценат Меценат

Всем привет. Использую плагин взаимопомощи аммо паков между игроков. Хотелось бы добавить лимиты доната за 1 раунд. Цели таковы:

1. За 1 раунд игрок может перевести другому игроку максимум 20 аммо паков.
2. Если он попробует совсем другому игроку задонатить, то плагин снова запоминает лимит, во второй попытке доната любому из двух игроков пишет:
You reached a limit of a donation for this player per 1 round.
**( Если не получится запоминать для большего числа игроков, то можно и общий лимит для всех в 20 аммо сделать )
3. Можно добавить сообщение в чате при вызове меню: /donate
[ZP] Maximum limit of donate is 20 ammo per 1 round.

Вот исходник плагина:
Код:
#include <amxmodx>
#include <cstrike>
#include <zombieplague>
#include <dhudmessage>

#define PLUGIN "ammo donate/dhud"
#define VERSION "1.5"
#define AUTHOR "user/zobie-dead bug fix/phantom fix"

new players_menu, players[32], num, i, player
new accessmenu, iName[64], callback
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /donate", "transfer_menu", ADMIN_ALL, "")


register_clcmd("transfer", "transfer_ammo", ADMIN_ALL, "")
}
public transfer_menu(id)
{
get_players(players, num, "h")
if (num <= 1)
{
set_dhudmessage(0, 155, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"There is nobody to transfer ammo")
return PLUGIN_HANDLED
}

new tempname[32], info[10]

players_menu = menu_create("Players", "players_menu_handler")

for(i = 0; i < num; i++)
{
if(players[i] == id)
continue

get_user_name(players[i], tempname, 31)
num_to_str(players[i], info, 9)
menu_additem(players_menu, tempname, info, 0)
}
menu_setprop(players_menu, MPROP_EXIT, MEXIT_ALL)

menu_display(id, players_menu, 0)
return PLUGIN_CONTINUE
}

public players_menu_handler(id, players_menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(players_menu)
return PLUGIN_HANDLED
}

new data[6]

menu_item_getinfo(players_menu, item, accessmenu, data, charsmax(data), iName, charsmax(iName), callback)

player = str_to_num(data)

if(id != player)
{
client_cmd(id, "messagemode ^"transfer %i^"", player)
}

return PLUGIN_CONTINUE
}

public transfer_ammo(id)
{
if(!is_user_connected(id) || !is_user_connected(player) || id == player)
return PLUGIN_HANDLED

new param[6]
read_argv(2, param, charsmax(param))

for (new x; x < strlen(param); x++)
{
if(!isdigit(param[x]))
{
set_dhudmessage(255, 0, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"Parameter has to be number")
return 0
}
}

new amount = str_to_num(param)

new ammo = zp_get_user_ammo_packs(id)

if (ammo < amount)
{
set_dhudmessage(255, 0, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"You dont have sufficient ammo!")
return 0
}

read_argv(1, param, charsmax(param))
new player = str_to_num(param)

if(player == id)
{
set_dhudmessage(255, 0, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"It is impossible to transfer ammo to itself")
return 0
}

new player_ammo = zp_get_user_ammo_packs(player)

zp_set_user_ammo_packs(id, ammo - amount)
zp_set_user_ammo_packs(player, player_ammo + amount)

new names[2][32]

get_user_name(id, names[0], 31)
get_user_name(player, names[1], 31)

set_dhudmessage(0, 125, 200, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(0,"Player %s donate %i ammo %s", names[0], amount, names[1])
return 0
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE*{\ rtf1\ ansi\ deff0{\ fonttbl{\ f0\ fnil Tahoma;}}n\ viewkind4\ uc1\ pard\ lang1049\ f0\ fs16 n\ par }*/


Отредактировал: sllrdp, - 11.2.2014, 16:12
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
eckoecko
сообщение 11.2.2014, 16:15
Сообщение #2
Стаж: 14 лет

Сообщений: 1705
Благодарностей: 266
Полезность: 0

sllrdp, на попробуй сначала сам, а мы если что, подправим.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Aikido
сообщение 11.2.2014, 16:22
Сообщение #3


Стаж: 12 лет

Сообщений: 287
Благодарностей: 326
Полезность: 1102

Меценат Меценат

eckoecko, боюсь заварю кашу, но попробую) Спасибо.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Aikido
сообщение 11.2.2014, 17:58
Сообщение #4


Стаж: 12 лет

Сообщений: 287
Благодарностей: 326
Полезность: 1102

Меценат Меценат

И так по порядку сделаем:

Добавляем глобальную переменную
Код:
#include <amxmodx>
#include <cstrike>
#include <zombieplague>
#include <dhudmessage>

#define PLUGIN "ammo donate/dhud"
#define VERSION "1.5"
#define AUTHOR "user/zobie-dead bug fix/phantom fix"

new players_menu, players[32], num, i, player
new accessmenu, iName[64], callback
new g_Round_counter


Регистрируем event и квар и указываем что g_Round_counter это и есть квар

Код:
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("HLTV", "RoundStart", "a", "1=0", "2=0")
register_cvar("amx_f_every_rounds","1")

register_clcmd("say /donate", "transfer_menu", ADMIN_ALL, "")
register_clcmd("transfer", "transfer_ammo", ADMIN_ALL, "")

g_Round_counter = get_cvar_num("amx_f_every_rounds")
}


Далее создаем функцию внутри которой к нашей переменной, в момент начала нового раунда будет прибавляться по единице:

Код:
public RoundStart(){
g_Round_counter++
}


Далее transfer_menu должен выполняться только один раз за раунд:

Код:
public transfer_menu(id)
{
get_players(players, num, "h")
if (num <= 1)
{
set_dhudmessage(0, 155, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"There is nobody to transfer ammo")
return PLUGIN_HANDLED
}

new tempname[32], info[10]

if(g_Round_counter >= get_cvar_num("amx_f_every_rounds")){

players_menu = menu_create("Players", "players_menu_handler")

for(i = 0; i < num; i++)
{
if(players[i] == id)
continue

get_user_name(players[i], tempname, 31)
num_to_str(players[i], info, 9)
menu_additem(players_menu, tempname, info, 0)
}
menu_setprop(players_menu, MPROP_EXIT, MEXIT_ALL)

menu_display(id, players_menu, 0)
g_Round_counter = 0 }
else {
client_print(id,print_chat,"You reached a limit of a donation for this round.",get_cvar_num("amx_f_every_rounds")-g_Round_counter)
return PLUGIN_CONTINUE
}

Здесь уже ошибки..
Скрытый текст
//AMXXPC compile.exe
// by the AMX Mod X Dev Team


//// zp_donate_ammo_packs.sma
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(55) : error 001: expected token: ";", but found "}"
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(61) : error 029: invalid expression, assumed zero
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(61) : error 017: undefined symbol "players_menu_handler"
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(63) : error 017: undefined symbol "item"
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(71) : error 017: undefined symbol "item"
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(71) : warning 215: expression has no effect
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(71) : warning 215: expression has no effect
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(71) : warning 215: expression has no effect
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(71) : warning 215: expression has no effect
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(71) : warning 215: expression has no effect
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(71) : warning 215: expression has no effect
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(71) : error 001: expected token: ";", but found ")"
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(71) : error 029: invalid expression, assumed zero
// E:\CS Server\Rezervat\Serv\cstrike\addons\amxmodx\scripting\zp_donate_ammo_pa
cks.sma(71) : fatal error 107: too many error messages on one line
//
// Compilation aborted.
// 8 Errors.


Отредактировал: sllrdp, - 11.2.2014, 18:01
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Aikido
сообщение 11.2.2014, 18:25
Сообщение #5


Стаж: 12 лет

Сообщений: 287
Благодарностей: 326
Полезность: 1102

Меценат Меценат

Решил проблему так. Плагин компилируется но нужна ваше мнение если все правильно сделано с проверкой на раунд:

Код:
#include <amxmodx>
#include <cstrike>
#include <zombieplague>
#include <dhudmessage>

#define PLUGIN "ammo donate/dhud"
#define VERSION "1.5"
#define AUTHOR "user/zobie-dead bug fix/phantom fix"

new players_menu, players[32], num, i, player
new accessmenu, iName[64], callback
new g_Round_counter
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("HLTV", "RoundStart", "a", "1=0", "2=0")
register_cvar("amx_f_every_rounds","1")

register_clcmd("say /donate", "transfer_menu", ADMIN_ALL, "")
register_clcmd("transfer", "transfer_ammo", ADMIN_ALL, "")

g_Round_counter = get_cvar_num("amx_f_every_rounds")
}
public RoundStart(){
g_Round_counter++
}
public transfer_menu(id)
{
get_players(players, num, "h")
if (num <= 1)
{
set_dhudmessage(0, 155, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"There is nobody to transfer ammo")
return PLUGIN_HANDLED
}

new tempname[32], info[10]

players_menu = menu_create("Players", "players_menu_handler")

for(i = 0; i < num; i++)
{
if(players[i] == id)
continue

get_user_name(players[i], tempname, 31)
num_to_str(players[i], info, 9)
menu_additem(players_menu, tempname, info, 0)
}
menu_setprop(players_menu, MPROP_EXIT, MEXIT_ALL)

menu_display(id, players_menu, 0)
return PLUGIN_CONTINUE
}

public Counter_check(id){

if(g_Round_counter >= get_cvar_num("amx_f_every_rounds")){
transfer_menu(id)
g_Round_counter = 0
}else{
client_print(id,print_chat,"You reached a limit of a donation for this round.",get_cvar_num("amx_f_every_rounds")-g_Round_counter)
}
}

public players_menu_handler(id, players_menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(players_menu)
return PLUGIN_HANDLED
}

new data[6]

menu_item_getinfo(players_menu, item, accessmenu, data, charsmax(data), iName, charsmax(iName), callback)

player = str_to_num(data)

if(id != player)
{
client_cmd(id, "messagemode ^"transfer %i^"", player)
}

return PLUGIN_CONTINUE
}

public transfer_ammo(id)
{
if(!is_user_connected(id) || !is_user_connected(player) || id == player)
return PLUGIN_HANDLED

new param[6]
read_argv(2, param, charsmax(param))

for (new x; x < strlen(param); x++)
{
if(!isdigit(param[x]))
{
set_dhudmessage(255, 0, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"Parameter has to be number")
return 0
}
}

new amount = str_to_num(param)

new ammo = zp_get_user_ammo_packs(id)

if (ammo < amount)
{
set_dhudmessage(255, 0, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"You dont have sufficient ammo!")
return 0
}

read_argv(1, param, charsmax(param))
new player = str_to_num(param)

if(player == id)
{
set_dhudmessage(255, 0, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"It is impossible to transfer ammo to itself")
return 0
}

new player_ammo = zp_get_user_ammo_packs(player)

zp_set_user_ammo_packs(id, ammo - amount)
zp_set_user_ammo_packs(player, player_ammo + amount)

new names[2][32]

get_user_name(id, names[0], 31)
get_user_name(player, names[1], 31)

set_dhudmessage(0, 125, 200, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(0,"Player %s donate %i ammo %s", names[0], amount, names[1])
return 0
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE*{\ rtf1\ ansi\ deff0{\ fonttbl{\ f0\ fnil Tahoma;}}n\ viewkind4\ uc1\ pard\ lang1049\ f0\ fs16 n\ par }*/


Вот функция:
Код:
public Counter_check(id){

if(g_Round_counter >= get_cvar_num("amx_f_every_rounds")){
transfer_menu(id) // Выполняет функцию показа меню
g_Round_counter = 0
}else{
client_print(id,print_chat,"You reached a limit of a donation for this round.",get_cvar_num("amx_f_every_rounds")-g_Round_counter)
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Aikido
сообщение 13.2.2014, 15:39
Сообщение #6


Стаж: 12 лет

Сообщений: 287
Благодарностей: 326
Полезность: 1102

Меценат Меценат

Всем привет! Очень добрый человек, наш админ Ilussion, все таки помог решить задачу, за что ему огромное спасибо!

Только осталась еще одна маленькая задача. При тестах обнаружилась ошибка.
Плагин не дает задонатить больше 20 аммо, однако по 20 аммо можно перевести хоть 10 раз за 1 раунд. А нужно блокировать передачу, больше 20 аммо за раунд не давать...
Посмотрите кто нибудь и попытайтесь найти ошибку, очень нуждаюсь в этом лимите. Игроки хитреют, и моды начали уж слишком часто покупаться)

Вот сурс кода:

Код:
#include <amxmodx>
#include <cstrike>
#include <zombieplague>
#include <dhudmessage>

#define PLUGIN "ammo donate/dhud"
#define VERSION "1.5"
#define AUTHOR "user/zobie-dead bug fix/phantom fix"

new players_menu, players[32], num, i, player
new accessmenu, iName[64], callback

new g_Donate[33]

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /donate", "transfer_menu", ADMIN_ALL, "")

register_event("HLTV", "event_round_start", "a", "1=0", "2=0")

register_clcmd("transfer", "transfer_ammo", ADMIN_ALL, "")
}

public event_round_start()
{
for (new id = 1; id <= get_maxplayers(); id++)
g_Donate[id] = 0
}

public transfer_menu(id)
{
get_players(players, num, "h")
if (num <= 1)
{
set_dhudmessage(0, 155, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"There is nobody to transfer ammo")
return PLUGIN_HANDLED
}

new tempname[32], info[10]

players_menu = menu_create("Players", "players_menu_handler")

for(i = 0; i < num; i++)
{
if(players[i] == id)
continue

get_user_name(players[i], tempname, 31)
num_to_str(players[i], info, 9)
menu_additem(players_menu, tempname, info, 0)
}
menu_setprop(players_menu, MPROP_EXIT, MEXIT_ALL)

menu_display(id, players_menu, 0)
return PLUGIN_CONTINUE
}

public players_menu_handler(id, players_menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(players_menu)
return PLUGIN_HANDLED
}

new data[6]

menu_item_getinfo(players_menu, item, accessmenu, data, charsmax(data), iName, charsmax(iName), callback)

player = str_to_num(data)

if(id != player)
{
client_cmd(id, "messagemode ^"transfer %i^"", player)
}

return PLUGIN_CONTINUE
}

public transfer_ammo(id)
{
if(!is_user_connected(id) || !is_user_connected(player) || id == player)
return PLUGIN_HANDLED

new param[6]
read_argv(2, param, charsmax(param))

for (new x; x < strlen(param); x++)
{
if(!isdigit(param[x]))
{
set_dhudmessage(255, 0, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"Parameter has to be number")
return 0
}
}
new limit = 20 // Устанавливем лимит для игрока

if(g_Donate[id] >= limit)
{
set_dhudmessage(255, 0, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"LIMIT MSG") // Соообщение, когда игрок уже передал 20 аммо, и плагин блокирует дальнейщую передачу аммо
return 0
}

new amount = str_to_num(param)

if(amount > limit - g_Donate[id])
{
set_dhudmessage(255, 0, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id, "%d AMMO LEFT", limit - g_Donate[id]) // Соообщение, когда игрок ввел сумму, которая больше чем он может передать
return 0
}

new ammo = zp_get_user_ammo_packs(id)

if (ammo < amount)
{
set_dhudmessage(255, 0, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"You dont have sufficient ammo!")
return 0
}

read_argv(1, param, charsmax(param))
new player = str_to_num(param)

if(player == id)
{
set_dhudmessage(255, 0, 0, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(id,"It is impossible to transfer ammo to itself")
return 0
}
g_Donate[id] += amount

new player_ammo = zp_get_user_ammo_packs(player)

zp_set_user_ammo_packs(id, ammo - amount)
zp_set_user_ammo_packs(player, player_ammo + amount)

new names[2][32]

get_user_name(id, names[0], 31)
get_user_name(player, names[1], 31)

set_dhudmessage(0, 125, 200, -1.0, 0.4, 0, 0.0, 5.0, 1.0, 1.0, false)
show_dhudmessage(0,"Player %s donate %i ammo %s", names[0], amount, names[1])
return 0
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE*{\ rtf1\ ansi\ deff0{\ fonttbl{\ f0\ fnil Tahoma;}}n\ viewkind4\ uc1\ pard\ lang1049\ f0\ fs16 n\ par }*/


Очень буду благодарен за помощь, с меня buhaem.gif и таранка =)

Отредактировал: sllrdp, - 13.2.2014, 15:41
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: