Оптимизация и доработка

Сообщения
263
Реакции
335
Помог
4 раз(а)
Недавно обсуждали в ТГ вопрос о нагрузке плагинов и пришли к выводу, что понять нагрузку можно лишь посмотрев на код. Собственно во вложении 3 плагина которые мне интересны. Интересует след.:

presents.sma | Решение (1, 2) : Оптимизация и доработка
  1. Как сделать что мы в след. раунде пропадали модельки подарка. Сейчас когда выпадает подарок, он лежит всю карту и не пропадает пока не поднимаешь.
  2. Как добавить glow эффект на модельку которая выпадает? Пробовал добавить в тупую копипастом с гугла, но в итоге у меня просто игроки которые выбрасывают подарок, светятся.
artefacts.sma
  1. Можно ли добавить ограничение на выбор артефакта? Если да, то как? Условно 1 раз за раунд или 1 раз за всю карту.
  2. Как модно добавить таймаут перед выбором, что бы с начала карты первые "n" минут нельзя было использовать меню и артефакты.
Ну и по каждому плагину интересует мнение по его написанию и нагрузке.
 

Download all Attachments

Последнее редактирование:
Сообщения
678
Реакции
580
Предупреждения
8
Помог
9 раз(а)
Вот что могу сказать про
presents.sma

если не обращать внимание на бесполезных проверок типа:
Код:

public EventKilled(id)
{
if(!is_user_connected(id))
return;

//....
}

Код:

public EventTouch(iEntity, id)
{
if(!is_user_alive(id))
return;

//....
}

норм код. вот только:
Код:

iRandomReward = random_num(0, 100);

->
Код:

iRandomReward = random(101);

//.....
Код:

static iOrigin[3];
get_user_origin(id, iOrigin, 0);

->
Код:

new Float:fOrigin[3];
pev(id, pev_origin, fOrigin)

тогда не нужно будет переоброзавать в float
Код:

static Float: fOrigin[3];
IVecFVec(iOrigin, fOrigin);

//.....
Код:

set_pev(iEntity, pev_origin, fOrigin);

->
Код:

engfunc(EngFunc_SetOrigin, iEntity, fOrigin);

и наконец:
Код:

drop_to_floor(iEntity);

engfunc(EngFunc_SetModel, iEntity, gModelPresent);
engfunc(EngFunc_SetSize, iEntity, Float:{-16.0, -16.0, -16.0}, Float:{16.0, 16.0, 16.0});

->
Код:

engfunc(EngFunc_SetSize, iEntity, Float:{-16.0, -16.0, 0.0}, Float:{16.0, 16.0, 16.0});
engfunc(EngFunc_SetModel, iEntity, gModelPresent);
engfunc(EngFunc_SetOrigin, iEntity, fOrigin);

drop_to_floor(iEntity);

12 Мар 2017
насчет вапросов:
1.
Код:

public plugin_init()
{
register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
}

public Event_NewRound()
{
new iEntity = FM_NULLENT,
while((iEntity = engfunc(EngFunc_FindEntityByString, iEntity, "classname", gClassName)))
{
remove_entity(iEntity)
}
}

2.
Код:
stock random_glow(iEntity, amount = 16.0)
{
set_pev(iEntity, pev_renderfx, kRenderFxGlowShell)

new Float:fRenderColor[3]
fRenderColor[0] = random_float(1.0, 255.0)
fRenderColor[1] = random_float(1.0, 255.0)
fRenderColor[2] = random_float(1.0, 255.0)

set_pev(iEntity, pev_rendercolor, fRenderColor)
set_pev(iEntity, pev_renderamt, amount)
}

12 Мар 2017
и вот дополнение для вопроса 1.
Код:

public plugin_init()
{
register_think(gClassName, "Kill_Think");
}

public Kill_Think(iEntity)
{
if(is_valid_ent(iEntity)) {
remove_entity(iEntity)
}
}

// ставим цинк при создании энтити
set_pev(iEntity, pev_nextthink, get_gametime() + 300.0) // 300.0 - 5 минут

полезно там где нет раундов (ксдм напр.)
12 Мар 2017
Забыл сказать - там рандом не очень.
 
Сообщения
263
Реакции
335
Помог
4 раз(а)
Vaqtincha, Спасибо за помощь, но ЧЯДНТ? :dntknw:
Glow эффект не работает.

PHP:

#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <engine>
#include <hamsandwich>

#define PLUGIN "Presents"
#define VERSION "1.0"
#define AUTHOR "6u3oH"

const RandomChance = 50; // Шанс на выпадение подарка (диапазон: от 0 до 100) [стандарт: 50%]
const RewardMoneyMin = 100; // Минимальная выдача денег
const RewardMoneyMax = 300; // Максимальная выдача денег

new iRandomReward, iMoney, GiveMoney, Name[32];
new const gClassName[] = "Present"
new const gModelPresent[] = "models/cs_lieq/presents/skull.mdl";

public plugin_precache()
{
precache_model(gModelPresent);
}

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_touch(gClassName, "player", "EventTouch");
register_think(gClassName, "Kill_Think");
register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
RegisterHam(Ham_Killed, "player", "EventKilled", .Post = true);
}

stock random_glow(iEntity, amount = 16.0)
{
set_pev(iEntity, pev_renderfx, kRenderFxGlowShell)

new Float:fRenderColor[3]
fRenderColor[0] = random_float(1.0, 255.0)
fRenderColor[1] = random_float(1.0, 255.0)
fRenderColor[2] = random_float(1.0, 255.0)

set_pev(iEntity, pev_rendercolor, fRenderColor)
set_pev(iEntity, pev_renderamt, amount)
}

public Event_NewRound()
{
new iEntity = FM_NULLENT
while((iEntity = engfunc(EngFunc_FindEntityByString, iEntity, "classname", gClassName)))
{
remove_entity(iEntity)
}
}
public Kill_Think(iEntity)
{
if(is_valid_ent(iEntity)) {
remove_entity(iEntity)
}
}
public EventKilled(id) // ID атакующего и эффекты нам не нужны
{
if(!is_user_connected(id))
return;

iRandomReward = random(101);

if(iRandomReward <= RandomChance)
return;

new Float:fOrigin[3];
pev(id, pev_origin, fOrigin)

static iEntity;
iEntity = create_entity("info_target");

if(!is_valid_ent(iEntity))
return;

engfunc(EngFunc_SetOrigin, iEntity, fOrigin);
set_pev(iEntity, pev_classname, gClassName);
set_pev(iEntity, pev_solid, SOLID_TRIGGER);
set_pev(iEntity, pev_movetype, MOVETYPE_NONE);
set_pev(iEntity, pev_nextthink, get_gametime() + 300.0) // 300.0 - 5 минут

engfunc(EngFunc_SetSize, iEntity, Float:{-16.0, -16.0, 0.0}, Float:{16.0, 16.0, 16.0});
engfunc(EngFunc_SetModel, iEntity, gModelPresent);
engfunc(EngFunc_SetOrigin, iEntity, fOrigin);

drop_to_floor(iEntity);
}

public EventTouch(iEntity, id)
{
if(!is_user_alive(id))
return;

if(!is_valid_ent(iEntity))
return;

GiveMoney = cs_get_user_money(id);
get_user_name(id, Name, 31);

iMoney = random_num(RewardMoneyMin, RewardMoneyMax);
client_print_color(id, print_chat, "^1[^4Presents^1] Игрок ^3%s ^1получает ^4%i$", Name, iMoney);
cs_set_user_money(id, GiveMoney + iMoney);

remove_entity(iEntity);
}

P.S. Не сразу нашел ошибку
PHP:
new iEntity = FM_NULLENT,

=>
PHP:
new iEntity = FM_NULLENT
 
Сообщения
678
Реакции
580
Предупреждения
8
Помог
9 раз(а)
SonG, функция random_glow сам по себе не работает. думайте.
 
Сообщения
263
Реакции
335
Помог
4 раз(а)
Vaqtincha, Спасибо, всё работает, поучилось в итоге так:

PHP:
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <engine>
#include <hamsandwich>

#define PLUGIN "Presents"
#define VERSION "1.0"
#define AUTHOR "6u3oH"

const RandomChance = 50; // Шанс на выпадение подарка (диапазон: от 0 до 100) [стандарт: 50%]
const RewardMoneyMin = 100; // Минимальная выдача денег
const RewardMoneyMax = 300; // Максимальная выдача денег

new iRandomReward, iMoney, GiveMoney, Name[32];
new const gClassName[] = "Present"
new const gModelPresent[] = "models/cs_lieq/presents/skull.mdl";

public plugin_precache()
{
precache_model(gModelPresent);
}

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_touch(gClassName, "player", "EventTouch");
register_think(gClassName, "Kill_Think");
register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
RegisterHam(Ham_Killed, "player", "EventKilled", .Post = true);
}

public Event_NewRound()
{
new iEntity = FM_NULLENT
while((iEntity = engfunc(EngFunc_FindEntityByString, iEntity, "classname", gClassName)))
{
remove_entity(iEntity)
}
}
public Kill_Think(iEntity)
{
if(is_valid_ent(iEntity)) {
remove_entity(iEntity)
}
}

public EventKilled(id)
{
if(!is_user_connected(id))
return;

iRandomReward = random(101);

if(iRandomReward <= RandomChance)
return;

new Float:fOrigin[3];
pev(id, pev_origin, fOrigin)

static iEntity;
iEntity = create_entity("info_target");

if(!is_valid_ent(iEntity))
return;

set_pev(iEntity, pev_classname, gClassName);
set_pev(iEntity, pev_solid, SOLID_TRIGGER);
set_pev(iEntity, pev_movetype, MOVETYPE_NONE);
set_pev(iEntity, pev_nextthink, get_gametime() + 300.0)

engfunc(EngFunc_SetSize, iEntity, Float:{-16.0, -16.0, 0.0}, Float:{16.0, 16.0, 16.0});
engfunc(EngFunc_SetModel, iEntity, gModelPresent);
engfunc(EngFunc_SetOrigin, iEntity, fOrigin);

new Float:fRenderColor[3]
fRenderColor[0] = random_float(1.0, 255.0)
fRenderColor[1] = random_float(1.0, 255.0)
fRenderColor[2] = random_float(1.0, 255.0)
set_pev(iEntity, pev_renderfx, kRenderFxGlowShell)
set_pev(iEntity, pev_rendercolor, fRenderColor)

drop_to_floor(iEntity);
}

public EventTouch(iEntity, id)
{
if(!is_user_alive(id))
return;

if(!is_valid_ent(iEntity))
return;

GiveMoney = cs_get_user_money(id);
get_user_name(id, Name, 31);

iMoney = random_num(RewardMoneyMin, RewardMoneyMax);
client_print_color(id, print_chat, "^1[^4Presents^1] Ты получил ^4%i$", iMoney);
cs_set_user_money(id, GiveMoney + iMoney);

remove_entity(iEntity);
}
 
Сообщения
678
Реакции
580
Предупреждения
8
Помог
9 раз(а)
SonG,
Код:
#include <amxmodx>
#include <cstrike>
#include <engine>


#if AMXX_VERSION_NUM < 183
#include <colorchat>
#endif

#define PLUGIN "Presents"
#define VERSION "1.0"
#define AUTHOR "6u3oH"

const RandomChance = 50; // Шанс на выпадение подарка (диапазон: от 0 до 100) [стандарт: 50%]
const RewardMoneyMin = 100; // Минимальная выдача денег
const RewardMoneyMax = 300; // Максимальная выдача денег

const Float:PR_KILL_DELAY = 300.0
const PR_MAX_MONEY = 16000


new const gClassName[] = "Present"
new const gModelPresent[] = "models/cs_lieq/presents/skull.mdl";

#define DeathMsg_VictimID 2
#define EN_NULLENT -1

public plugin_precache()
{
precache_model(gModelPresent);
}

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);

register_touch(gClassName, "player", "EventTouch");
register_think(gClassName, "Kill_Think");
register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
register_event("DeathMsg", "EventKilled", "a")
}

public Event_NewRound()
{
new iEntity = EN_NULLENT
while((iEntity = find_ent_by_class(iEntity, gClassName)))
{
remove_entity(iEntity)
}
}

public Kill_Think(iEntity)
{
if(is_valid_ent(iEntity)) {
remove_entity(iEntity)
}
}

public EventKilled()
{
new id = read_data( DeathMsg_VictimID )
if(!is_user_connected(id))
return

new iRandomReward = random(101)
if(iRandomReward <= RandomChance)
return

new iEntity = create_entity("info_target")
if(!is_valid_ent(iEntity))
return

new Float:fOrigin[3], Float:fRenderColor[3]
entity_get_vector(id, EV_VEC_origin, fOrigin)

entity_set_string(iEntity, EV_SZ_classname, gClassName)
entity_set_int(iEntity, EV_INT_solid, SOLID_TRIGGER)
entity_set_int(iEntity, EV_INT_movetype, MOVETYPE_NONE)
entity_set_float(iEntity, EV_FL_nextthink, get_gametime() + PR_KILL_DELAY)

entity_set_size(iEntity, Float:{-16.0, -16.0, 0.0}, Float:{16.0, 16.0, 16.0})
entity_set_model(iEntity, gModelPresent)
entity_set_origin(iEntity, fOrigin)

fRenderColor[0] = random_float(1.0, 255.0)
fRenderColor[1] = random_float(1.0, 255.0)
fRenderColor[2] = random_float(1.0, 255.0)
entity_set_int(iEntity, EV_INT_renderfx, kRenderFxGlowShell)
entity_set_vector(iEntity, EV_VEC_rendercolor, fRenderColor)

drop_to_floor(iEntity)
}

public EventTouch(iEntity, id)
{
if(!is_user_alive(id))
return

if(!is_valid_ent(iEntity))
return

new Name[32]
get_user_name(id, Name, charsmax(Name));

new iMoney = random_num(RewardMoneyMin, RewardMoneyMax);
client_print_color(id, print_chat, "^1[^4Presents^1] Ты получил ^4%i$", iMoney)
cs_set_user_money(id, min(cs_get_user_money(id) + iMoney, PR_MAX_MONEY))

remove_entity(iEntity)
}


 
Сообщения
263
Реакции
335
Помог
4 раз(а)
Ребят, вопрос по второму плагину. Правильно ли я сделал ограничение использования меню, 1 раз за раунд?

PHP:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>
#include <hamsandwich>

#define PLUGIN "Artefacts"
#define VERSION "1.0"
#define AUTHOR "6u3oH"

new g_Round_counter
new Float: DmgFloat, DmgInt;

const HealthPoint = 100; // Максимальное кол-во HP

new keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_0;

new ArtNum[33], Chance[33];

new ArtefactsChance[6] =
{
30,
25,
10,
15,
25
};

new ArtefactsList[6][] =
{
"Боевая Стойка",
"Фатальный Удар",
"Озарение",
"Танец Огня",
"Зеркальный барьер",
"Не выбран"
};

new ArtefactsDescription[6][] =
{
"30% шанс понизить получаемый урон в 2 раза",
"25% щанс нанести крит", // Крит = урон х2
"10% шанс пополнить здоровье на 50% от атаки",
"15% шанс уклониться от атаки противника",
"25% шанс отразить урон противника",
"Отсутствует"
};

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("HLTV", "RoundStart", "a", "1=0", "2=0")
g_Round_counter = 1

register_clcmd("say /artefact", "ArtefactsMenu");
register_clcmd("say /art", "ArtefactsMenu");

register_menu("Menu 1", keys, "Menu_Artefacts");
RegisterHam(Ham_TakeDamage, "player", "TakeDamageFunction", .Post = false);

}
public RoundStart(){
g_Round_counter++
}

public client_connect(id)
{
ArtNum[id] = 5;
}

public ArtefactsMenu(id)
{
if(!is_user_alive(id))
return;
if(g_Round_counter >= 1){

static menu[650], iLen
iLen = 0
iLen = formatex(menu[iLen], charsmax(menu) - iLen, "\yВаш артефакт: %s^n\rВыберите артефакт^n^n", ArtefactsList[ArtNum[id]]);

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1. \y%s^n", ArtefactsList[0]);
keys |= MENU_KEY_1

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r2. \y%s^n", ArtefactsList[1]);
keys |= MENU_KEY_2

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r3. \y%s^n", ArtefactsList[2]);
keys |= MENU_KEY_3

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r4. \y%s^n", ArtefactsList[3]);
keys |= MENU_KEY_4

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r5. \y%s^n^n", ArtefactsList[4]);
keys |= MENU_KEY_5

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r0. \wВыход^n");
keys |= MENU_KEY_0

show_menu(id, keys, menu, -1, "Menu 1");
g_Round_counter = 0
}else{
client_print_color(id, print_chat, "^1[^4Artefacts^1] Взять артефакт можно^3 1 раз ^1за раунд", ArtefactsList[1]);
}
}

public Menu_Artefacts(id, key)
{
if(!is_user_alive(id))
return;

switch(key)
{
case 0:
{
ArtNum[id] = 0;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[0]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[0]);
}

case 1:
{
ArtNum[id] = 1;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[1]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[1]);
}

case 2:
{
ArtNum[id] = 2;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[2]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[2]);
}

case 3:
{
ArtNum[id] = 3;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[3]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[3]);
}

case 4:
{
ArtNum[id] = 4;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[4]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[4]);
}
}
}

public TakeDamageFunction(szVictim, szWeapon, szAttacker, Float: fDmg, damagebits)
{
if(!is_user_connected(szVictim))
return PLUGIN_HANDLED;

if(!is_user_connected(szAttacker))
return PLUGIN_HANDLED;

if(szVictim == szAttacker)
return PLUGIN_HANDLED;

if(cs_get_user_team(szVictim) == cs_get_user_team(szAttacker))
return PLUGIN_HANDLED;

switch(ArtNum[szAttacker])
{
case 1:
{
Chance[szAttacker] = random_num(0, 100);

if(Chance[szAttacker] <= ArtefactsChance[1])
{
FadeRender(szAttacker);

DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szVictim, get_user_health(szVictim) - DmgInt);
client_print(szAttacker, print_center, "[Артефакт] Вы нанесли критический урон");
}
}

case 2:
{
Chance[szAttacker] = random_num(0, 100);


if(Chance[szAttacker] <= ArtefactsChance[2])
{
set_user_health(szAttacker, get_user_health(szAttacker) + (HealthPoint / 2));

FadeRender(szAttacker);

if(get_user_health(szAttacker) > HealthPoint)
{
set_user_health(szAttacker, HealthPoint);
}
client_print(szAttacker, print_center, "[Артефакт] Вы пополнили здоровье на %i единиц!", HealthPoint / 2);
}
}
}

switch(ArtNum[szVictim])
{
case 0:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[0])
{
FadeRender(szVictim);

DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szVictim, get_user_health(szVictim) + (DmgInt / 2));

client_print(szVictim, print_center, "[Артефакт] Урон понижен в два раза!");
}
}

case 3:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[3])
{
FadeRender(szVictim);
client_print(szVictim, print_center, "[Артефакт] Вы не получили урон!");
return HAM_SUPERCEDE;
}
}

case 4:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[4])
{
FadeRender(szVictim);
DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szAttacker, get_user_health(szAttacker) - DmgInt);
client_print(szVictim, print_center, "[Артефакт] Вы отразили урон!");
}
}
}

return PLUGIN_HANDLED;
}

public FadeRender(id)
{
if(!is_user_alive(id))
return;

message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id);
write_short(1<<10);
write_short(1<<10);
write_short(0x0000);
write_byte(random_num(0, 255));
write_byte(random_num(0, 255));
write_byte(random_num(0, 255));
write_byte(100);
message_end();
}
 
Сообщения
443
Реакции
319
Помог
13 раз(а)
Неа
ты сделал общий ограничитель

сделай так
ну точнее измени g_Round_counter
на g_Round_counter[33] в начале где new, в плагин инит убери его вообще
g_Round_counter[id] в остальных местах
а сюда client_connect добавь g_Round_counter[id]=0;
public RoundStart(){ g_Round_counter++ }
измени на
public RoundStart(){ for(new i;i<33;i++)g_Round_counter[id]++; }
вроде все
 
Сообщения
263
Реакции
335
Помог
4 раз(а)
shelru, artefacts.sma(68) : error 017: undefined symbol "id"
P.S. А где можно узнать подробней ?
общий ограничитель
PHP:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>
#include <hamsandwich>

#define PLUGIN "Artefacts"
#define VERSION "1.0"
#define AUTHOR "6u3oH"

new g_Round_counter[33]
new Float: DmgFloat, DmgInt;

const HealthPoint = 100; // Максимальное кол-во HP

new keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_0;

new ArtNum[33], Chance[33];

new ArtefactsChance[6] =
{
30,
25,
10,
15,
25
};

new ArtefactsList[6][] =
{
"Боевая Стойка",
"Фатальный Удар",
"Озарение",
"Танец Огня",
"Зеркальный барьер",
"Не выбран"
};

new ArtefactsDescription[6][] =
{
"30% шанс понизить получаемый урон в 2 раза",
"25% щанс нанести крит", // Крит = урон х2
"10% шанс пополнить здоровье на 50% от атаки",
"15% шанс уклониться от атаки противника",
"25% шанс отразить урон противника",
"Отсутствует"
};

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("HLTV", "RoundStart", "a", "1=0", "2=0")

register_clcmd("say /artefact", "ArtefactsMenu");
register_clcmd("say /art", "ArtefactsMenu");

register_menu("Menu 1", keys, "Menu_Artefacts");
RegisterHam(Ham_TakeDamage, "player", "TakeDamageFunction", .Post = false);

}

public RoundStart(){
for(new i;i<33;i++)g_Round_counter[id]++
}

public client_connect(id)
{
ArtNum[id] = 5;
g_Round_counter[id]=0;
}

public ArtefactsMenu(id)
{
if(!is_user_alive(id))
return;
if(g_Round_counter[id] >= 1){

static menu[650], iLen
iLen = 0
iLen = formatex(menu[iLen], charsmax(menu) - iLen, "\yВаш артефакт: %s^n\rВыберите артефакт^n^n", ArtefactsList[ArtNum[id]]);

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1. \y%s^n", ArtefactsList[0]);
keys |= MENU_KEY_1

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r2. \y%s^n", ArtefactsList[1]);
keys |= MENU_KEY_2

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r3. \y%s^n", ArtefactsList[2]);
keys |= MENU_KEY_3

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r4. \y%s^n", ArtefactsList[3]);
keys |= MENU_KEY_4

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r5. \y%s^n^n", ArtefactsList[4]);
keys |= MENU_KEY_5

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r0. \wВыход^n");
keys |= MENU_KEY_0

show_menu(id, keys, menu, -1, "Menu 1");
g_Round_counter[id] = 0
}else{
client_print_color(id, print_chat, "^1[^4Artefacts^1] Взять артефакт можно^3 1 раз ^1за раунд", ArtefactsList[1]);
}
}

public Menu_Artefacts(id, key)
{
if(!is_user_alive(id))
return;

switch(key)
{
case 0:
{
ArtNum[id] = 0;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[0]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[0]);
}

case 1:
{
ArtNum[id] = 1;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[1]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[1]);
}

case 2:
{
ArtNum[id] = 2;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[2]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[2]);
}

case 3:
{
ArtNum[id] = 3;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[3]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[3]);
}

case 4:
{
ArtNum[id] = 4;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[4]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[4]);
}
}
}

public TakeDamageFunction(szVictim, szWeapon, szAttacker, Float: fDmg, damagebits)
{
if(!is_user_connected(szVictim))
return PLUGIN_HANDLED;

if(!is_user_connected(szAttacker))
return PLUGIN_HANDLED;

if(szVictim == szAttacker)
return PLUGIN_HANDLED;

if(cs_get_user_team(szVictim) == cs_get_user_team(szAttacker))
return PLUGIN_HANDLED;

switch(ArtNum[szAttacker])
{
case 1:
{
Chance[szAttacker] = random_num(0, 100);

if(Chance[szAttacker] <= ArtefactsChance[1])
{
FadeRender(szAttacker);

DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szVictim, get_user_health(szVictim) - DmgInt);
client_print(szAttacker, print_center, "[Артефакт] Вы нанесли критический урон");
}
}

case 2:
{
Chance[szAttacker] = random_num(0, 100);


if(Chance[szAttacker] <= ArtefactsChance[2])
{
set_user_health(szAttacker, get_user_health(szAttacker) + (HealthPoint / 2));

FadeRender(szAttacker);

if(get_user_health(szAttacker) > HealthPoint)
{
set_user_health(szAttacker, HealthPoint);
}
client_print(szAttacker, print_center, "[Артефакт] Вы пополнили здоровье на %i единиц!", HealthPoint / 2);
}
}
}

switch(ArtNum[szVictim])
{
case 0:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[0])
{
FadeRender(szVictim);

DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szVictim, get_user_health(szVictim) + (DmgInt / 2));

client_print(szVictim, print_center, "[Артефакт] Урон понижен в два раза!");
}
}

case 3:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[3])
{
FadeRender(szVictim);
client_print(szVictim, print_center, "[Артефакт] Вы не получили урон!");
return HAM_SUPERCEDE;
}
}

case 4:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[4])
{
FadeRender(szVictim);
DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szAttacker, get_user_health(szAttacker) - DmgInt);
client_print(szVictim, print_center, "[Артефакт] Вы отразили урон!");
}
}
}

return PLUGIN_HANDLED;
}

public FadeRender(id)
{
if(!is_user_alive(id))
return;

message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id);
write_short(1<<10);
write_short(1<<10);
write_short(0x0000);
write_byte(random_num(0, 255));
write_byte(random_num(0, 255));
write_byte(random_num(0, 255));
write_byte(100);
message_end();
}
 
Сообщения
443
Реакции
319
Помог
13 раз(а)
Да вроде все должно компилироваться.
замени
for(new i;i<33;i++)g_Round_counter[id]++
на
for(new i;i<33;i++)g_Round_counter++
13 Мар 2017
Бля
Там бб код id заамени на i
 
  • Нравится
Реакции: SonG
Сообщения
263
Реакции
335
Помог
4 раз(а)
shelru, Во, теперь найс компилит, спс)
PHP:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>
#include <hamsandwich>

#define PLUGIN "Artefacts"
#define VERSION "1.0"
#define AUTHOR "6u3oH"

new g_Round_counter[33]
new Float: DmgFloat, DmgInt;

const HealthPoint = 100; // Максимальное кол-во HP

new keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_0;

new ArtNum[33], Chance[33];

new ArtefactsChance[6] =
{
30,
25,
10,
15,
25
};

new ArtefactsList[6][] =
{
"Боевая Стойка",
"Фатальный Удар",
"Озарение",
"Танец Огня",
"Зеркальный барьер",
"Не выбран"
};

new ArtefactsDescription[6][] =
{
"30% шанс понизить получаемый урон в 2 раза",
"25% щанс нанести крит", // Крит = урон х2
"10% шанс пополнить здоровье на 50% от атаки",
"15% шанс уклониться от атаки противника",
"25% шанс отразить урон противника",
"Отсутствует"
};

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("HLTV", "RoundStart", "a", "1=0", "2=0")

register_clcmd("say /artefact", "ArtefactsMenu");
register_clcmd("say /art", "ArtefactsMenu");

register_menu("Menu 1", keys, "Menu_Artefacts");
RegisterHam(Ham_TakeDamage, "player", "TakeDamageFunction", .Post = false);

}

public RoundStart(){
for(new i;i<33;i++)g_Round_counter++
}

public client_connect(id)
{
ArtNum[id] = 5;
g_Round_counter[id]=0;
}

public ArtefactsMenu(id)
{
if(!is_user_alive(id))
return;
if(g_Round_counter[id] >= 1){

static menu[650], iLen
iLen = 0
iLen = formatex(menu[iLen], charsmax(menu) - iLen, "\yВаш артефакт: %s^n\rВыберите артефакт^n^n", ArtefactsList[ArtNum[id]]);

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1. \y%s^n", ArtefactsList[0]);
keys |= MENU_KEY_1

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r2. \y%s^n", ArtefactsList[1]);
keys |= MENU_KEY_2

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r3. \y%s^n", ArtefactsList[2]);
keys |= MENU_KEY_3

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r4. \y%s^n", ArtefactsList[3]);
keys |= MENU_KEY_4

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r5. \y%s^n^n", ArtefactsList[4]);
keys |= MENU_KEY_5

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r0. \wВыход^n");
keys |= MENU_KEY_0

show_menu(id, keys, menu, -1, "Menu 1");
g_Round_counter[id] = 0
}else{
client_print_color(id, print_chat, "^1[^4Artefacts^1] Взять артефакт можно^3 1 раз ^1за раунд", ArtefactsList[1]);
}
}

public Menu_Artefacts(id, key)
{
if(!is_user_alive(id))
return;

switch(key)
{
case 0:
{
ArtNum[id] = 0;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[0]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[0]);
}

case 1:
{
ArtNum[id] = 1;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[1]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[1]);
}

case 2:
{
ArtNum[id] = 2;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[2]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[2]);
}

case 3:
{
ArtNum[id] = 3;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[3]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[3]);
}

case 4:
{
ArtNum[id] = 4;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[4]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[4]);
}
}
}

public TakeDamageFunction(szVictim, szWeapon, szAttacker, Float: fDmg, damagebits)
{
if(!is_user_connected(szVictim))
return PLUGIN_HANDLED;

if(!is_user_connected(szAttacker))
return PLUGIN_HANDLED;

if(szVictim == szAttacker)
return PLUGIN_HANDLED;

if(cs_get_user_team(szVictim) == cs_get_user_team(szAttacker))
return PLUGIN_HANDLED;

switch(ArtNum[szAttacker])
{
case 1:
{
Chance[szAttacker] = random_num(0, 100);

if(Chance[szAttacker] <= ArtefactsChance[1])
{
FadeRender(szAttacker);

DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szVictim, get_user_health(szVictim) - DmgInt);
client_print(szAttacker, print_center, "[Артефакт] Вы нанесли критический урон");
}
}

case 2:
{
Chance[szAttacker] = random_num(0, 100);


if(Chance[szAttacker] <= ArtefactsChance[2])
{
set_user_health(szAttacker, get_user_health(szAttacker) + (HealthPoint / 2));

FadeRender(szAttacker);

if(get_user_health(szAttacker) > HealthPoint)
{
set_user_health(szAttacker, HealthPoint);
}
client_print(szAttacker, print_center, "[Артефакт] Вы пополнили здоровье на %i единиц!", HealthPoint / 2);
}
}
}

switch(ArtNum[szVictim])
{
case 0:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[0])
{
FadeRender(szVictim);

DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szVictim, get_user_health(szVictim) + (DmgInt / 2));

client_print(szVictim, print_center, "[Артефакт] Урон понижен в два раза!");
}
}

case 3:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[3])
{
FadeRender(szVictim);
client_print(szVictim, print_center, "[Артефакт] Вы не получили урон!");
return HAM_SUPERCEDE;
}
}

case 4:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[4])
{
FadeRender(szVictim);
DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szAttacker, get_user_health(szAttacker) - DmgInt);
client_print(szVictim, print_center, "[Артефакт] Вы отразили урон!");
}
}
}

return PLUGIN_HANDLED;
}

public FadeRender(id)
{
if(!is_user_alive(id))
return;

message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id);
write_short(1<<10);
write_short(1<<10);
write_short(0x0000);
write_byte(random_num(0, 255));
write_byte(random_num(0, 255));
write_byte(random_num(0, 255));
write_byte(100);
message_end();
}

 
Сообщения
443
Реакции
319
Помог
13 раз(а)
Vaqtincha, Да, я чет забыл, обычно его юзал.
 
Сообщения
678
Реакции
580
Предупреждения
8
Помог
9 раз(а)
SonG, я не вижу в коде обнулнение
Код:
g_Round_counter

после рестарта роунда (але новая игра)
 
Сообщения
263
Реакции
335
Помог
4 раз(а)
Vaqtincha, ?
PHP:
register_event("TextMsg", "EventRestart", "a", "2&#Game_C", "2&#Game_w");


PHP:
public EventRestart(id)
{
g_Round_counter[id] = 0;
}
 
Сообщения
678
Реакции
580
Предупреждения
8
Помог
9 раз(а)
SonG,
Код:
register_event( "TextMsg", "Event_NewGame", "a", "2=#Game_will_restart_in", "2=#Game_Commencing" )
 
Сообщения
263
Реакции
335
Помог
4 раз(а)
Vaqtincha, Я правильно понимаю, это необходимо что бы можно было использовать функцию после "restart" в консоли? Если да, то не помогло добавление или я нарукожопил

PHP:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>
#include <hamsandwich>

#define PLUGIN "Artefacts"
#define VERSION "1.0"
#define AUTHOR "6u3oH"

new g_Round_counter[33]
new Float: DmgFloat, DmgInt;

const HealthPoint = 100; // Максимальное кол-во HP

new keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_0;

new ArtNum[33], Chance[33];

new ArtefactsChance[6] =
{
30,
25,
10,
15,
25
};

new ArtefactsList[6][] =
{
"Боевая Стойка",
"Фатальный Удар",
"Озарение",
"Танец Огня",
"Зеркальный барьер",
"Не выбран"
};

new ArtefactsDescription[6][] =
{
"30% шанс понизить получаемый урон в 2 раза",
"25% щанс нанести крит", // Крит = урон х2
"10% шанс пополнить здоровье на 50% от атаки",
"15% шанс уклониться от атаки противника",
"25% шанс отразить урон противника",
"Отсутствует"
};

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("TextMsg", "Event_NewGame", "a", "2=#Game_will_restart_in", "2=#Game_Commencing");
register_event("HLTV", "RoundStart", "a", "1=0", "2=0")

register_clcmd("say /artefact", "ArtefactsMenu");
register_clcmd("say /art", "ArtefactsMenu");

register_menu("Menu 1", keys, "Menu_Artefacts");
RegisterHam(Ham_TakeDamage, "player", "TakeDamageFunction", .Post = false);

}

public Event_NewGame(id)
{
g_Round_counter[id] = 0;
}

public client_connect(id)
{
ArtNum[id] = 5;
g_Round_counter[id]=0;
}

public RoundStart(){
for(new i;i<33;i++)g_Round_counter++
}

public ArtefactsMenu(id)
{
if(!is_user_alive(id))
return;
static menu[650], iLen
iLen = 0
iLen = formatex(menu[iLen], charsmax(menu) - iLen, "\yВаш артефакт: %s^n\rВыберите артефакт^n^n", ArtefactsList[ArtNum[id]]);

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1. \y%s^n", ArtefactsList[0]);
keys |= MENU_KEY_1

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r2. \y%s^n", ArtefactsList[1]);
keys |= MENU_KEY_2

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r3. \y%s^n", ArtefactsList[2]);
keys |= MENU_KEY_3

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r4. \y%s^n", ArtefactsList[3]);
keys |= MENU_KEY_4

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r5. \y%s^n^n", ArtefactsList[4]);
keys |= MENU_KEY_5

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r0. \wВыход^n");
keys |= MENU_KEY_0

show_menu(id, keys, menu, -1, "Menu 1");
g_Round_counter[id] = 0

}

public Menu_Artefacts(id, key)
{
if(!is_user_alive(id))
return;
if(g_Round_counter[id] >= 1)
{
switch(key)
{
case 0:
{
ArtNum[id] = 0;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[0]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[0]);
}

case 1:
{
ArtNum[id] = 1;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[1]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[1]);
}

case 2:
{
ArtNum[id] = 2;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[2]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[2]);
}

case 3:
{
ArtNum[id] = 3;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[3]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[3]);
}

case 4:
{
ArtNum[id] = 4;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[4]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[4]);
}
}
}else{
client_print_color(id, print_chat, "^1[^4Artefacts^1] Взять артефакт можно^3 1 раз ^1за раунд");
}
}

public TakeDamageFunction(szVictim, szWeapon, szAttacker, Float: fDmg, damagebits)
{
if(!is_user_connected(szVictim))
return PLUGIN_HANDLED;

if(!is_user_connected(szAttacker))
return PLUGIN_HANDLED;

if(szVictim == szAttacker)
return PLUGIN_HANDLED;

if(cs_get_user_team(szVictim) == cs_get_user_team(szAttacker))
return PLUGIN_HANDLED;

switch(ArtNum[szAttacker])
{
case 1:
{
Chance[szAttacker] = random_num(0, 100);

if(Chance[szAttacker] <= ArtefactsChance[1])
{
FadeRender(szAttacker);

DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szVictim, get_user_health(szVictim) - DmgInt);
client_print(szAttacker, print_center, "[Артефакт] Вы нанесли критический урон");
}
}

case 2:
{
Chance[szAttacker] = random_num(0, 100);


if(Chance[szAttacker] <= ArtefactsChance[2])
{
set_user_health(szAttacker, get_user_health(szAttacker) + (HealthPoint / 2));

FadeRender(szAttacker);

if(get_user_health(szAttacker) > HealthPoint)
{
set_user_health(szAttacker, HealthPoint);
}
client_print(szAttacker, print_center, "[Артефакт] Вы пополнили здоровье на %i единиц!", HealthPoint / 2);
}
}
}

switch(ArtNum[szVictim])
{
case 0:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[0])
{
FadeRender(szVictim);

DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szVictim, get_user_health(szVictim) + (DmgInt / 2));

client_print(szVictim, print_center, "[Артефакт] Урон понижен в два раза!");
}
}

case 3:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[3])
{
FadeRender(szVictim);
client_print(szVictim, print_center, "[Артефакт] Вы не получили урон!");
return HAM_SUPERCEDE;
}
}

case 4:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[4])
{
FadeRender(szVictim);
DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szAttacker, get_user_health(szAttacker) - DmgInt);
client_print(szVictim, print_center, "[Артефакт] Вы отразили урон!");
}
}
}

return PLUGIN_HANDLED;
}

public FadeRender(id)
{
if(!is_user_alive(id))
return;

message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id);
write_short(1<<10);
write_short(1<<10);
write_short(0x0000);
write_byte(random_num(0, 255));
write_byte(random_num(0, 255));
write_byte(random_num(0, 255));
write_byte(100);
message_end();
}

 
Сообщения
678
Реакции
580
Предупреждения
8
Помог
9 раз(а)
SonG, g_Round_counter у вас не массив и да
Код:
register_event( "TextMsg", "Event_NewGame", "a", "2=#Game_will_restart_in", "2=#Game_Commencing" )

флаг "a" глобал эвент
 
  • Нравится
Реакции: SonG
Сообщения
263
Реакции
335
Помог
4 раз(а)
В итоге вот:
PHP:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>
#include <hamsandwich>

#define PLUGIN "Artefacts"
#define VERSION "1.0"
#define AUTHOR "6u3oH"

new Float: DmgFloat, DmgInt;

const HealthPoint = 100; // Максимальное кол-во HP

new keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_0;

new ArtNum[33], Chance[33], g_Round_counter[33];

new ArtefactsChance[6] =
{
30,
25,
10,
15,
25
};

new ArtefactsList[6][] =
{
"Боевая Стойка",
"Фатальный Удар",
"Озарение",
"Танец Огня",
"Зеркальный барьер",
"Не выбран"
};

new ArtefactsDescription[6][] =
{
"30% шанс понизить получаемый урон в 2 раза",
"25% щанс нанести крит", // Крит = урон х2
"10% шанс пополнить здоровье на 50% от атаки",
"15% шанс уклониться от атаки противника",
"25% шанс отразить урон противника",
"Отсутствует"
};

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("HLTV", "RoundStart", "a", "1=0", "2=0");
register_event("TextMsg", "Event_NewGame", "a", "2=#Game_will_restart_in", "2=#Game_Commencing");

register_clcmd("say /artefact", "ArtefactsMenu");
register_clcmd("say /art", "ArtefactsMenu");

register_menu("Menu 1", keys, "Menu_Artefacts");
RegisterHam(Ham_TakeDamage, "player", "TakeDamageFunction", .Post = false);

}

public Event_NewGame() {
arrayset(g_Round_counter, 0, 33);
}

public client_connect(id)
{
ArtNum[id] = 5;
g_Round_counter[id]=0;
}

public RoundStart(){
arrayset(g_Round_counter, 0, 33);
}

public ArtefactsMenu(id)
{
if(!is_user_alive(id))return;
if(g_Round_counter[id]!=0){client_print_color(id, print_chat, "^1[^4Artefacts^1] Взять артефакт можно^3 1 раз ^1за раунд");return;}

static menu[650], iLen
iLen = 0
iLen = formatex(menu[iLen], charsmax(menu) - iLen, "\yВаш артефакт: %s^n\rВыберите артефакт^n^n", ArtefactsList[ArtNum[id]]);

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1. \y%s^n", ArtefactsList[0]);
keys |= MENU_KEY_1

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r2. \y%s^n", ArtefactsList[1]);
keys |= MENU_KEY_2

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r3. \y%s^n", ArtefactsList[2]);
keys |= MENU_KEY_3

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r4. \y%s^n", ArtefactsList[3]);
keys |= MENU_KEY_4

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r5. \y%s^n^n", ArtefactsList[4]);
keys |= MENU_KEY_5

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r0. \wВыход^n");
keys |= MENU_KEY_0

show_menu(id, keys, menu, -1, "Menu 1");
}

public Menu_Artefacts(id, key){
if(!is_user_alive(id))return;
switch(key){
case 0:
{
ArtNum[id] = 0;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[0]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[0]);
}

case 1:
{
ArtNum[id] = 1;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[1]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[1]);
}

case 2:
{
ArtNum[id] = 2;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[2]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[2]);
}

case 3:
{
ArtNum[id] = 3;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[3]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[3]);
}

case 4:
{
ArtNum[id] = 4;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[4]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[4]);
}
}
g_Round_counter[id]++;
}

public TakeDamageFunction(szVictim, szWeapon, szAttacker, Float: fDmg, damagebits)
{
if(!is_user_connected(szVictim))
return PLUGIN_HANDLED;

if(!is_user_connected(szAttacker))
return PLUGIN_HANDLED;

if(szVictim == szAttacker)
return PLUGIN_HANDLED;

if(cs_get_user_team(szVictim) == cs_get_user_team(szAttacker))
return PLUGIN_HANDLED;

switch(ArtNum[szAttacker])
{
case 1:
{
Chance[szAttacker] = random_num(0, 100);

if(Chance[szAttacker] <= ArtefactsChance[1])
{
FadeRender(szAttacker);

DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szVictim, get_user_health(szVictim) - DmgInt);
client_print(szAttacker, print_center, "[Артефакт] Вы нанесли критический урон");
}
}

case 2:
{
Chance[szAttacker] = random_num(0, 100);


if(Chance[szAttacker] <= ArtefactsChance[2])
{
set_user_health(szAttacker, get_user_health(szAttacker) + (HealthPoint / 2));

FadeRender(szAttacker);

if(get_user_health(szAttacker) > HealthPoint)
{
set_user_health(szAttacker, HealthPoint);
}
client_print(szAttacker, print_center, "[Артефакт] Вы пополнили здоровье на %i единиц!", HealthPoint / 2);
}
}
}

switch(ArtNum[szVictim])
{
case 0:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[0])
{
FadeRender(szVictim);

DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szVictim, get_user_health(szVictim) + (DmgInt / 2));

client_print(szVictim, print_center, "[Артефакт] Урон понижен в два раза!");
}
}

case 3:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[3])
{
FadeRender(szVictim);
client_print(szVictim, print_center, "[Артефакт] Вы не получили урон!");
return HAM_SUPERCEDE;
}
}

case 4:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[4])
{
FadeRender(szVictim);
DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szAttacker, get_user_health(szAttacker) - DmgInt);
client_print(szVictim, print_center, "[Артефакт] Вы отразили урон!");
}
}
}

return PLUGIN_HANDLED;
}

public FadeRender(id)
{
if(!is_user_alive(id))
return;

message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id);
write_short(1<<10);
write_short(1<<10);
write_short(0x0000);
write_byte(random_num(0, 255));
write_byte(random_num(0, 255));
write_byte(random_num(0, 255));
write_byte(100);
message_end();
}
15 Мар 2017
В итоге вот:
PHP:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>
#include <hamsandwich>

#define PLUGIN "Artefacts"
#define VERSION "1.0"
#define AUTHOR "6u3oH"

new Float: DmgFloat, DmgInt;

const HealthPoint = 100; // Максимальное кол-во HP

new keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_0;

new ArtNum[33], Chance[33], g_Round_counter[33];

new ArtefactsChance[6] =
{
30,
25,
10,
15,
25
};

new ArtefactsList[6][] =
{
"Боевая Стойка",
"Фатальный Удар",
"Озарение",
"Танец Огня",
"Зеркальный барьер",
"Не выбран"
};

new ArtefactsDescription[6][] =
{
"30% шанс понизить получаемый урон в 2 раза",
"25% щанс нанести крит", // Крит = урон х2
"10% шанс пополнить здоровье на 50% от атаки",
"15% шанс уклониться от атаки противника",
"25% шанс отразить урон противника",
"Отсутствует"
};

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("HLTV", "RoundStart", "a", "1=0", "2=0");
register_event("TextMsg", "Event_NewGame", "a", "2=#Game_will_restart_in", "2=#Game_Commencing");

register_clcmd("say /artefact", "ArtefactsMenu");
register_clcmd("say /art", "ArtefactsMenu");

register_menu("Menu 1", keys, "Menu_Artefacts");
RegisterHam(Ham_TakeDamage, "player", "TakeDamageFunction", .Post = false);

}

public Event_NewGame() {
arrayset(g_Round_counter, 0, 33);
}

public client_connect(id)
{
ArtNum[id] = 5;
g_Round_counter[id]=0;
}

public RoundStart(){
arrayset(g_Round_counter, 0, 33);
}

public ArtefactsMenu(id)
{
if(!is_user_alive(id))return;
if(g_Round_counter[id]!=0){client_print_color(id, print_chat, "^1[^4Artefacts^1] Взять артефакт можно^3 1 раз ^1за раунд");return;}

static menu[650], iLen
iLen = 0
iLen = formatex(menu[iLen], charsmax(menu) - iLen, "\yВаш артефакт: %s^n\rВыберите артефакт^n^n", ArtefactsList[ArtNum[id]]);

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r1. \y%s^n", ArtefactsList[0]);
keys |= MENU_KEY_1

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r2. \y%s^n", ArtefactsList[1]);
keys |= MENU_KEY_2

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r3. \y%s^n", ArtefactsList[2]);
keys |= MENU_KEY_3

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r4. \y%s^n", ArtefactsList[3]);
keys |= MENU_KEY_4

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r5. \y%s^n^n", ArtefactsList[4]);
keys |= MENU_KEY_5

iLen += formatex(menu[iLen], charsmax(menu) - iLen, "\r0. \wВыход^n");
keys |= MENU_KEY_0

show_menu(id, keys, menu, -1, "Menu 1");
}

public Menu_Artefacts(id, key){
if(!is_user_alive(id))return;
switch(key){
case 0:
{
ArtNum[id] = 0;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[0]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[0]);
}

case 1:
{
ArtNum[id] = 1;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[1]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[1]);
}

case 2:
{
ArtNum[id] = 2;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[2]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[2]);
}

case 3:
{
ArtNum[id] = 3;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[3]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[3]);
}

case 4:
{
ArtNum[id] = 4;
client_print_color(id, print_chat, "^1[^4Artefacts^1] Вы выбрали артефакт: ^4%s", ArtefactsList[4]);
client_print_color(id, print_chat, "^1[^4Artefacts^1] Способность: ^4%s", ArtefactsDescription[4]);
}
}
g_Round_counter[id]++;
}

public TakeDamageFunction(szVictim, szWeapon, szAttacker, Float: fDmg, damagebits)
{
if(!is_user_connected(szVictim))
return PLUGIN_HANDLED;

if(!is_user_connected(szAttacker))
return PLUGIN_HANDLED;

if(szVictim == szAttacker)
return PLUGIN_HANDLED;

if(cs_get_user_team(szVictim) == cs_get_user_team(szAttacker))
return PLUGIN_HANDLED;

switch(ArtNum[szAttacker])
{
case 1:
{
Chance[szAttacker] = random_num(0, 100);

if(Chance[szAttacker] <= ArtefactsChance[1])
{
FadeRender(szAttacker);

DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szVictim, get_user_health(szVictim) - DmgInt);
client_print(szAttacker, print_center, "[Артефакт] Вы нанесли критический урон");
}
}

case 2:
{
Chance[szAttacker] = random_num(0, 100);


if(Chance[szAttacker] <= ArtefactsChance[2])
{
set_user_health(szAttacker, get_user_health(szAttacker) + (HealthPoint / 2));

FadeRender(szAttacker);

if(get_user_health(szAttacker) > HealthPoint)
{
set_user_health(szAttacker, HealthPoint);
}
client_print(szAttacker, print_center, "[Артефакт] Вы пополнили здоровье на %i единиц!", HealthPoint / 2);
}
}
}

switch(ArtNum[szVictim])
{
case 0:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[0])
{
FadeRender(szVictim);

DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szVictim, get_user_health(szVictim) + (DmgInt / 2));

client_print(szVictim, print_center, "[Артефакт] Урон понижен в два раза!");
}
}

case 3:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[3])
{
FadeRender(szVictim);
client_print(szVictim, print_center, "[Артефакт] Вы не получили урон!");
return HAM_SUPERCEDE;
}
}

case 4:
{
Chance[szVictim] = random_num(0, 100);

if(Chance[szVictim] <= ArtefactsChance[4])
{
FadeRender(szVictim);
DmgFloat = fDmg;
DmgInt = floatround(DmgFloat, floatround_round);

set_user_health(szAttacker, get_user_health(szAttacker) - DmgInt);
client_print(szVictim, print_center, "[Артефакт] Вы отразили урон!");
}
}
}

return PLUGIN_HANDLED;
}

public FadeRender(id)
{
if(!is_user_alive(id))
return;

message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id);
write_short(1<<10);
write_short(1<<10);
write_short(0x0000);
write_byte(random_num(0, 255));
write_byte(random_num(0, 255));
write_byte(random_num(0, 255));
write_byte(100);
message_end();
}
Хмм, заметил одну багу. Если взять "25% щанс нанести крит" то бывает в момент стрельбы в противника, когда срабатывает эффект, противник просто умирает как будто падает с высоты, и в итоге тебе не защитывают килл =/
 
Сообщения
443
Реакции
319
Помог
13 раз(а)
Проблема в set_user_health. Над пользоваться хамом уже, раз его юзаем.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу