Код
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
// Максимальное количество создаваемых объектов на карте
#define MAX_WALL 100
// получаем оффсет винда\линукс
#if cellbits == 32
#define OFFSET_CSMONEY 115
#else
#define OFFSET_CSMONEY 140
#endif
// дополнительный оффсет для игрока (линукс)
#define OFFSET_LINUX 5
new const max_ammount[33] = {-2, 52, 0, 90, 1, 32, 1, 100, 90, 1, 120, 100, 100, 90, 90, 90, 100, 120, 30, 120, 200, 32, 90, 120, 90, 2, 35, 90, 90, 0, 100, -1, -1}
new cvar_task, g_msg_money, g_armortype, g_maxplayers
new mapname[33] // массив под название карты
new num_coord // Количество координат под объекты
new Float:g_origin[MAX_WALL][3] // Кординаты появления
new g_ammo[33] // сколько раз игрок использовал
new g_inviz[33] // сколько раз игрок использовал
new g_vesthelm[33] // сколько раз игрок использовал
new g_health[33] // сколько раз игрок использовал
// Имя модели, const - значит массив нельзя изменить.
new const models_ammo[] = "models/power/ammo.mdl"
new const models_inviz[] = "models/power/inviz.mdl"
new const models_health[] = "models/power/health.mdl"
// Имя звука
new const sound_item[] = "power/item.wav"
new const sound_ammo[] = "power/ammo.wav"
new const sound_inviz[] = "power/inviz.wav"
new const sound_health[] = "power/health.wav"
public plugin_init()
{
register_plugin("Power Bonus", "1.0", "artist666")
register_event("CurWeapon", "event_curweapon", "be", "1=1", "2!0", "2!4", "2!6", "2!9", "2!25", "2!29")
RegisterHam(Ham_Spawn, "player", "player_spawn", 1)
register_forward(FM_Touch, "ent_touth") // отлавливаем касание 2х объектов
get_mapname(mapname, charsmax(mapname)) // получаем название карты
load_coord() // получаем координаты из файла
cvar_task = register_cvar("cvar_task", "60.0") // квар, через сколько объект вновь появится
g_maxplayers = get_maxplayers() // получаем количество слотов
set_task(5.0, "add_power") // запускаем таск через 5 секунд(установить все объекты)
}
public plugin_precache() // Вызывается при старте сервера, раньше инициализации
{
// добавляем в прекэш модели
precache_model(models_ammo)
precache_model(models_inviz)
precache_model(models_health)
//добавляем в прекэш звуки
precache_sound(sound_item)
precache_sound(sound_ammo)
precache_sound(sound_inviz)
precache_sound(sound_health)
}
public load_coord()
{
// получаем путь к файлу
new filename[64]; format(filename, charsmax(filename), "addons/amxmodx/configs/powercord/%s.ini", mapname)
if(!file_exists(filename)) //если такого файла нет
{
log_amx("No load %s", filename) //записать в лог
return //выход
}
// открываем файл
new buffer[512], x[8], y[8], z[8], file = fopen(filename, "rt")
//цикл - файл открыт и не кончился
while(file && !feof(file))
{
fgets(file, buffer, charsmax(buffer)) // Считываем строку(при каждом новом вызове функции она автоматом съезжает на строку ниже)
trim(buffer) // удаляем пробелы по краям
if(!buffer[0] || buffer[0] == ' '|| buffer[0] == ';') continue // если пустая строка или пробел или; читать следующую
// разбиваем строку на аргументы(слова)
parse(buffer, x, charsmax(x), y, charsmax(y), z, charsmax(z))
trim(x); trim(y); trim(z) // удаляем пробелы по краям
//записываем координаты
g_origin[num_coord][0] = float(str_to_num(x))
g_origin[num_coord][1] = float(str_to_num(y))
g_origin[num_coord][2] = float(str_to_num(z))
num_coord++
}
if(file) fclose(file) // закрываем файл
}
public add_power()
{
for(new i = 0; i < num_coord; i++) add_entity(g_origin[i])
}
public add_entity(Float:origin[3])
{
static ent; ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))// создать объект
if(!pev_valid(ent)) return // если объект не создался, идём дальше
switch(random_num(0, 4)) // случайный объект
{
case 0:
{
engfunc(EngFunc_SetModel, ent, models_ammo) // Установить модель объекту
set_pev(ent, pev_classname, "ent_ammo") // Установить имя объекту
}
case 1:
{
engfunc(EngFunc_SetModel, ent, models_health) // Установить модель объекту
set_pev(ent, pev_classname, "ent_health") // Установить имя объекту
}
case 4:
{
engfunc(EngFunc_SetModel, ent, models_inviz) // Установить модель объекту
set_pev(ent, pev_classname, "ent_inviz") // Установить имя объекту
}
}
engfunc(EngFunc_SetSize, ent, Float:{-5.0, -5.0, 0.0}, Float:{5.0, 5.0, 10.0}) // Установить размеры объекту, из переданных в функцию массивов
set_pev(ent, pev_solid, SOLID_TRIGGER) // Установить твёрдость объекту - твёрдый
set_pev(ent, pev_movetype, MOVETYPE_NONE) // Установить тип движения - никакой
set_pev(ent, pev_angles, Float:{0.0, 0.0, 90.0}) // Установить угол
engfunc(EngFunc_SetOrigin, ent, origin) // Установить координаты объекту
emit_sound(ent, CHAN_AUTO, sound_item, 1.0, ATTN_NORM, 0, PITCH_NORM) // воспроизвести звук появления
}
public ent_touth(ent, id)
{
static classname[33]; pev(id, pev_classname, classname, charsmax(classname)) // получаем имя класса того кто коснулся
if(equal(classname, "player") && is_user_alive(id)) // если это игрок и он жив
{
static entname[33]; pev(ent, pev_classname, entname, charsmax(entname)) // получаем имя класса кого коснулись
if(equal(entname, "ent_", 4)) // сравниваем часть имени
{
switch(entname[4]) //сверяем по 4й ячейке
{
case 'a': // ammo
{
switch(g_ammo[id])
{
case 0: {g_ammo[id] = 1; update_max_ammo(id);}
case 1: g_ammo[id] = 2
case 2: {g_ammo[id] = 3; item_hegrenade(id);}
default: return FMRES_SUPERCEDE
}
emit_sound(ent, CHAN_AUTO, sound_ammo, 1.0, ATTN_NORM, 0, PITCH_NORM)
}
case 'h': // health
{
static health; health = pev(id, pev_health)
switch(g_health[id])
{
case 0: {set_pev(id, pev_health, health+250.0); g_health[id] = 1;}
case 1: {set_pev(id, pev_health, health+250.0); g_health[id] = 2;}
case 2: {set_pev(id, pev_health, health+250.0); g_health[id] = 3;}
default: return FMRES_SUPERCEDE
}
emit_sound(ent, CHAN_AUTO, sound_health, 1.0, ATTN_NORM, 0, PITCH_NORM)
}
case 'i': // inviz
{
switch(g_inviz[id])
{
case 0: {fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 0,kRenderTransAlpha, 100); g_inviz[id] = 1;}
case 1: {fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 0,kRenderTransAlpha, 50); g_inviz[id] = 2;}
case 2: {fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 0,kRenderTransAlpha, 10); g_inviz[id] = 3;}
default: return FMRES_SUPERCEDE
}
emit_sound(ent, CHAN_AUTO, sound_inviz, 1.0, ATTN_NORM, 0, PITCH_NORM)
}
}
static Float:origin[3]; pev(ent, pev_origin, origin)
set_task(get_pcvar_float(cvar_task), "add_entity", 666, _:origin, sizeof(origin), "a", 1)
engfunc(EngFunc_RemoveEntity, ent)
}
}
return FMRES_IGNORED
}
public player_spawn(id)
{
g_ammo[id] = 0
g_health[id] = 0
g_inviz[id] = 0
g_vesthelm[id] = 0
fm_set_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, 255) // убираем невидимость
}
public event_curweapon(id)
{
if(1 < g_ammo[id] < 4)
{
static clip, ammo, weap; weap = read_data(2)
get_user_ammo(id, weap, clip, ammo)
if(ammo < max_ammount[weap]) fm_set_user_bpammo(id, weap, max_ammount[weap])
}
}
public item_hegrenade(id)
{
if(g_ammo[id] == 3)
{
fm_give_item(id, "weapon_hegrenade")
set_task(60.0, "item_hegrenade", id, _, _, "a", 1)
}
}
// выдача патронов
public update_max_ammo(id)
{
if(g_ammo[id] == 1)
{
static weapons[32], num, wpn; get_user_weapons(id, weapons, num)
for(new i = 0; i < num; i++)
{
wpn = weapons[i]
if(wpn != 0 && wpn != 4 && wpn != 6 && wpn != 9 && wpn != 25 && wpn != 29)
{
static clip, ammo; get_user_ammo(id, wpn, clip, ammo)
if(ammo >= 200) continue
else if((ammo+30) >= 200) fm_set_user_bpammo(id, wpn, 200)
else fm_set_user_bpammo(id, wpn, ammo+30)
}
}
set_task(60.0, "update_max_ammo", id, _, _, "a", 1)
}
}
// выдача оружия
stock fm_give_item(id, const item[])
{
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item))
if(!pev_valid(ent)) return 0
new Float:origin[3]; pev(id, pev_origin, origin)
set_pev(ent, pev_origin, origin)
set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN)
dllfunc(DLLFunc_Spawn, ent)
new save = pev(ent, pev_solid)
dllfunc(DLLFunc_Touch, ent, id)
if(pev(ent, pev_solid) != save) return ent
engfunc(EngFunc_RemoveEntity, ent)
return -1
}
// установка патронов в запас
stock fm_set_user_bpammo(id, weapon, amount)
{
switch(weapon)
{
case CSW_AWP: set_pdata_int(id, 377, amount, OFFSET_LINUX)
case CSW_SCOUT, CSW_AK47, CSW_G3SG1: set_pdata_int(id, 378, amount, OFFSET_LINUX)
case CSW_M249: set_pdata_int(id, 379, amount, OFFSET_LINUX)
case CSW_M4A1, CSW_FAMAS, CSW_AUG, CSW_SG550, CSW_GALI, CSW_SG552: set_pdata_int(id, 380, amount, OFFSET_LINUX)
case CSW_M3, CSW_XM1014: set_pdata_int(id, 381, amount, OFFSET_LINUX)
case CSW_USP, CSW_UMP45, CSW_MAC10: set_pdata_int(id, 382, amount, OFFSET_LINUX)
case CSW_FIVESEVEN, CSW_P90: set_pdata_int(id, 383, amount, OFFSET_LINUX)
case CSW_DEAGLE: set_pdata_int(id, 384, amount, OFFSET_LINUX)
case CSW_P228: set_pdata_int(id, 385, amount, OFFSET_LINUX)
case CSW_GLOCK18, CSW_MP5NAVY, CSW_TMP, CSW_ELITE: set_pdata_int(id, 386, amount, OFFSET_LINUX)
case CSW_FLASHBANG: set_pdata_int(id, 387, amount, OFFSET_LINUX)
case CSW_HEGRENADE: set_pdata_int(id, 388, amount, OFFSET_LINUX)
case CSW_SMOKEGRENADE: set_pdata_int(id, 389, amount, OFFSET_LINUX)
case CSW_C4: set_pdata_int(id, 390, amount, OFFSET_LINUX)
}
}
// установка брони
stock fm_set_user_armor(id, value, type = 0)
{
set_pdata_int(id, 112, type, 5)
set_pev(id, pev_armorvalue, float(value))
if(type != 0)
{
emessage_begin(MSG_ONE_UNRELIABLE, g_armortype, _, id)
ewrite_byte(type == 2 ? 1 : 0)
emessage_end()
}
}
// установка невидимости
stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
{
new Float:RenderColor[3]
RenderColor[0] = float(r)
RenderColor[1] = float(g)
RenderColor[2] = float(b)
set_pev(entity, pev_renderfx, fx)
set_pev(entity, pev_rendercolor, RenderColor)
set_pev(entity, pev_rendermode, render)
set_pev(entity, pev_renderamt, float(amount))
return 1
}
// установка денег
stock fm_set_user_money(id, money, flash = 1)
{
set_pdata_int(id, OFFSET_CSMONEY, money, OFFSET_LINUX)
message_begin(MSG_ONE, g_msg_money, {0,0,0}, id)
write_long(money)
write_byte(flash)
message_end()
}
// получить деньги
stock fm_get_user_money(id)
{
return get_pdata_int(id, OFFSET_CSMONEY, OFFSET_LINUX)
}
Цитата
L 06/17/2017 - 19:14:28: [FAKEMETA] Invalid entity
L 06/17/2017 - 19:14:28: [AMXX] Displaying debug trace (plugin "power_bonus.amxx")
L 06/17/2017 - 19:14:28: [AMXX] Run time error 10: native error (native "pev")
L 06/17/2017 - 19:14:28: [AMXX] [0] power_bonus.sma::ent_touth (line 130)