Relax123 » 25 сен 2018, 15:02
//ПРОБУЙ
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#define PLUGIN "CS Medic NPC"
#define VERSION "1.0"
#define AUTHOR "Mr. Smit"
#define TAG "[Medic]"
#if cellbits == 32
#define OFFSET_CSMONEY 115
#else
#define OFFSET_CSMONEY 140
#endif
#define OFFSET_LINUX 5
new MODE,REG_HEALTH, MAXHEALTH, COSTS,SHOUT, MESSAGE, COOLDOWN
new PlayerReload[33]
//////////////////////////////////////
// CVAR STUFF!
//////////////////////////////////////
#define CVAR_NAME "sb_npc_model"
new model[32];
new g_npcModel[63];
new g_modelName;
//////////////////////////////////////
//////////////////////////////////////
// NPC STUFF!
//////////////////////////////////////
#define menuKeys ((1<<0)|(1<<1))
new g_npc;
new g_weapon;
new bool:npcMade;
new bool:inMenu[33];
new filename[256];
//////////////////////////////////////
public plugin_init()
{
new confFolder[32];
get_mapname(filename, 255);
get_configsdir(confFolder, 31);
format(filename, 255, "%s/npcsaved/%s.coord", confFolder, filename);
set_task(3.0, "loadNPC");
register_plugin(PLUGIN, VERSION, AUTHOR);
register_dictionary("medic-mod.txt")
register_forward(FM_PlayerPreThink, "hook_PlayerPreThink");
register_forward(FM_AddToFullPack, "fw_AddToFullPack", 1);
register_forward(FM_Touch, "hook_Touch");
register_event("ResetHUD", "hook_ResetHUD", "be");
register_menucmd(register_menuid("npcMenu"), menuKeys, "npcMenuEnter");
register_concmd("amx_createnpc", "tryCreateNPC", ADMIN_RCON, "- creates the surf board NPC");
register_cvar("medic_version",VERSION,FCVAR_SERVER);
set_cvar_string("medic_version",VERSION);
/* Register CVARs */
MODE = register_cvar("medic_enabled","1") /* Mode 1: On ;; Mode 0: Off */
REG_HEALTH = register_cvar("medic_health","115") // How many Health you get instantly?
MAXHEALTH = register_cvar("medic_maxhp","10000") // Maximal HP for everyone
COSTS = register_cvar("medic_costs","5") // How many costs medic?
SHOUT = register_cvar("medic_shout","1") // Shout Medic if you buy medic?
MESSAGE = register_cvar("medic_message","1") // Write a Message if somebody ask for medic's help?
COOLDOWN = register_cvar("medic_cooldown","3") // Cooldown-Time in Seconds
/* Register Commands */
}
public plugin_precache()
{
g_modelName = register_cvar(CVAR_NAME, "medic-mod");
get_pcvar_string(g_modelName, model, 31);
formatex(g_npcModel, 63, "models/%s.mdl", model, model);
precache_model(g_npcModel);
precache_sound("medic.wav")
}
public client_connect(id)
{
inMenu[id] = false;
PlayerReload[id] = 0
}
public client_disconnect(id)
{
PlayerReload[id] = 0
}
public call_medic(id) {
if(get_pcvar_num(MODE) == 1 && PlayerReload[id] < time())
{
new ActuellHP = get_user_health(id);
new ActuellMoney = fm_cs_get_user_money(id);
if(ActuellMoney < get_pcvar_num(COSTS))
{
client_print(id, print_chat, "%L", id, "MED_HAVENOT_MONEY", TAG );
}
else
{
if(ActuellHP < get_pcvar_num(MAXHEALTH))
{
/* Shout if activated */
/* Write message if activated */
new playerCount, i, players[32], name[33];
get_players(players, playerCount, "ach");
get_user_name(id,name,32)
for(i=1; i<=playerCount; i++)
{
if(get_user_team(id) == get_user_team(i))
{
if(get_pcvar_num(MESSAGE) == 1)
{
client_print(0, print_chat, "%L", LANG_PLAYER, "MED_SOMEBODY_ASK", TAG );
if(get_pcvar_num(SHOUT) == 1)
{
engfunc(EngFunc_EmitSound, i, CHAN_ITEM, "medic.wav", 1.0, ATTN_NORM, 0, PITCH_NORM);
}
}
}
}
new Float:Lebenplus = get_pcvar_float(REG_HEALTH);
if(ActuellHP + Lebenplus > get_pcvar_num(MAXHEALTH))
{
set_pev(id,pev_health,get_pcvar_float(MAXHEALTH))
}
else
{
set_pev(id,pev_health,ActuellHP + Lebenplus);
}
PlayerReload[id] = time() + get_pcvar_num(COOLDOWN) /* Activate Reload */
fm_cs_set_user_money(id,ActuellMoney-get_pcvar_num(COSTS),1) /* Pay.. */
}
else
{
client_print(id, print_chat, "%L", id, "MED_HPNORMAL", TAG );
}
}
}
else
{
if(get_pcvar_num(MODE) != 1)
client_print(id, print_chat, "%L", id, "MED_DISABLED", TAG );
else
{
new Seconds = PlayerReload[id] - time()
client_print(id, print_chat, "%L", id, "MED_WAIT", TAG, Seconds );
}
}
return PLUGIN_HANDLED;
}
stock fm_cs_set_user_money(id,money,flash=1)
{
set_pdata_int(id,OFFSET_CSMONEY,money,OFFSET_LINUX);
message_begin(MSG_ONE,get_user_msgid("Money"),{0,0,0},id);
write_long(money);
write_byte(flash);
message_end();
}
stock fm_cs_get_user_money(id)
{
return get_pdata_int(id,OFFSET_CSMONEY,OFFSET_LINUX);
}
public hook_ResetHUD(id)
inMenu[id] = false;
public hook_Touch(ent, id)
{
if(!is_user_alive(id))
return FMRES_IGNORED;
if(!pev_valid(id))
return FMRES_IGNORED;
new classname[32];
pev(ent, pev_classname, classname, 31);
if(equali(classname, "shacks_npc") && !inMenu[id])
{
inMenu[id] = true;
new name[33], text[512];
get_user_name(id, name, 32);
format(text, 511, "%L", id, "MED_MENU", name);
show_menu(id, menuKeys, text, -1, "npcMenu");
}
return FMRES_IGNORED;
}
//////////////////////////////////////////////
// NPC STUFF
//////////////////////////////////////////////
public npcMenu(id)
{
new name[33], text[512];
get_user_name(id, name, 32);
format(text, 511, "%L", id, "MED_MENU", name);
show_menu(id, menuKeys, text, -1, "npcMenu");
return FMRES_HANDLED;
}
public npcMenuEnter(id, key)
{
switch(key)
{
case 0:
{
// Key 1
call_medic(id);
inMenu[id] = false;
}
case 1:
{
// Key 2
inMenu[id] = false;
client_print(id, print_chat, "%L", id, "MED_DONTWANT", TAG );
}
}
}
public tryCreateNPC(id, level, cid)
{
if(!cmd_access(id, level, cid, 1))
return FMRES_IGNORED;
createNPC(id);
return FMRES_HANDLED;
}
public loadNPC()
createNPC(0);
public createNPC(id)
{
new tempModel[32];
get_pcvar_string(g_modelName, tempModel, 31);
if(!equal(model, tempModel))
{
client_print(id, print_chat, "%L", id, "MED_ERRORRESTART", CVAR_NAME );
return FMRES_IGNORED;
}
if(npcMade && pev_valid(g_npc))
{
engfunc(EngFunc_RemoveEntity, g_npc);
engfunc(EngFunc_RemoveEntity, g_weapon);
}
npcMade = true;
new Float:origin[3], Float:angles[3];
if(id > 0)
{
pev(id, pev_origin, origin);
pev(id, pev_angles, angles);
}
else
{
new file = fopen(filename, "r");
if(file)
{
// File exists
new data[128];
new i;
while(!feof(file))
{
fgets(file, data, 127);
if(i <= 2) // Line 1-3 = origin
{
origin[i] = str_to_float(data);
}
else if(i == 3) angles[0] = str_to_float(data);
else if(i == 4) angles[1] = str_to_float(data);
else if(i == 5) angles[2] = str_to_float(data);
i++;
}
fclose(file);
}
else
{
// File doesn't exist, exit function
return FMRES_IGNORED;
}
}
// Create the npc entity
g_npc = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
engfunc(EngFunc_SetModel, g_npc, g_npcModel);
engfunc(EngFunc_SetSize, g_npc, Float:{-17.0,-17.0,-36.0}, Float:{17.0,17.0,36.0});
angles[0] = 0.0;
set_pev(g_npc, pev_angles, angles);
engfunc(EngFunc_SetOrigin, g_npc, origin);
if(id > 0)
{
origin[2] += 80;
engfunc(EngFunc_SetOrigin, id, origin);
}
set_pev(g_npc, pev_solid, SOLID_BBOX);
//set_pev(g_npc, pev_movetype, MOVETYPE_TOSS);
set_pev(g_npc, pev_classname, "shacks_npc");
// Set the default animation
set_pev(g_npc, pev_animtime, 2.0);
set_pev(g_npc, pev_framerate, 1.0);
set_pev(g_npc, pev_sequence, 1);
// Set bone positions
set_pev(g_npc, pev_controller_0, 125);
set_pev(g_npc, pev_controller_1, 125);
set_pev(g_npc, pev_controller_2, 125);
set_pev(g_npc, pev_controller_3, 125);
// Set damage and hp
set_pev(g_npc, pev_takedamage, 0.0);
// Drop to ground?
engfunc(EngFunc_DropToFloor, g_npc);
// Save the origin + angles
if(id > 0)
{
new filepointer = fopen(filename, "w+");
if(filepointer)
{
fprintf(filepointer, "%f^n%f^n%f^n%f^n%f^n%f", origin[0], origin[1], origin[2], angles[0], angles[1], angles[2]);
fclose(filepointer);
client_print(id, print_chat, "%L", id, "MED_SAVED");
}
}
return FMRES_HANDLED;
}