Helló
Kösz a segítséget, de én még 1 valamit nem értek, hogy minek kell az azonosító amikor csak egy helyet kellene letárolni? Mivel én nem bizonyos játékosokat akarok spawolni, hanem azt a "vip modelt", amit a plugin rak le az amx_cratenpc paranccsal.
Na akkor úgy kellene hogy a configs/cords/surf_ski_2.cords-ba beleírom pl ezt: amx_createnpc 200,120,21
Azért mellékelem az sma-t ha valaki így jobban tud segíteni
Kód: #include <amxmodx> #include <amxmisc> #include <fakemeta>
#define PLUGIN "CS Surf Boards" #define VERSION "1.0" #define AUTHOR "hlstriker"
////////////////////////////////////// // SURF BOARD STUFF! ////////////////////////////////////// #define BOARD_MODEL1 "models/board3.mdl" // Model by Jester new bool:hasBoard[33]; new boards[33]; new bool:shouldSurf[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_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"); }
public plugin_precache() { g_modelName = register_cvar(CVAR_NAME, "vip"); get_pcvar_string(g_modelName, model, 31); formatex(g_npcModel, 63, "models/player/%s/%s.mdl", model, model); precache_model(g_npcModel); precache_model(BOARD_MODEL1); }
public client_connect(id) { inMenu[id] = false; hasBoard[id] = false; }
public client_disconnect(id) { if(hasBoard[id]) engfunc(EngFunc_RemoveEntity, boards[id]); hasBoard[id] = false; }
public hook_ResetHUD(id) inMenu[id] = false;
public hook_Touch(ent, id) { if(!is_user_alive(id)) return FMRES_IGNORED; new classname[32]; pev(ent, pev_classname, classname, 31); if((equali(classname, "worldspawn") || equali(classname, "func_wall")) && hasBoard[id] && !(pev(ent, pev_flags) & FL_ONGROUND)) { remove_task(id); shouldSurf[id] = true; set_task(0.5, "resetSurfing", id); } if(equali(classname, "shacks_npc") && !inMenu[id]) { inMenu[id] = true; new name[33], text[512]; get_user_name(id, name, 32); format(text, 511, "Yo %s!^n^nWould you like a surf board?^n^n1: Yes - 2: No", name); show_menu(id, menuKeys, text, -1, "npcMenu"); } return FMRES_IGNORED; }
public resetSurfing(id) { shouldSurf[id] = false; }
public fw_AddToFullPack(es_handle,e,ent,host,hostflags,player,pSet) { if(!is_user_alive(ent) || pev(ent, pev_flags) & FL_ONGROUND || !hasBoard[ent] || pev(ent, pev_movetype) == MOVETYPE_FLY) return FMRES_IGNORED; new waterlevel = pev(ent, pev_waterlevel); if((shouldSurf[ent] || (waterlevel > 0 && waterlevel <= 2)) && !(pev(ent, pev_flags) & FL_ONGROUND)) { // Board under feet set_es(es_handle, ES_Sequence, 6); set_es(es_handle, ES_GaitSequence, 0); set_es(es_handle, ES_Frame, 255.0); set_es(es_handle, ES_FrameRate, 1.0); } else if(pev(ent, pev_flags) & FL_ONGROUND && waterlevel == 0) { // Board on back return FMRES_HANDLED; } else if(pev(ent, pev_movetype) == MOVETYPE_FLY || !shouldSurf[ent] || waterlevel >= 3) { // Board under arm set_es(es_handle, ES_Sequence, 8); set_es(es_handle, ES_GaitSequence, 0); set_es(es_handle, ES_Frame, 255.0); set_es(es_handle, ES_FrameRate, 1.0); } return FMRES_HANDLED; }
public hook_PlayerPreThink(id) { if(!is_user_alive(id) || !hasBoard[id]) return FMRES_IGNORED; new waterlevel = pev(id, pev_waterlevel); // if(shouldSurf[id] || (waterlevel > 0 && waterlevel <= 2 && !(pev(id, pev_flags) & FL_ONGROUND))) if((shouldSurf[id] || (waterlevel > 0 && waterlevel <= 2)) && !(pev(id, pev_flags) & FL_ONGROUND)) { // Board under feet set_pev(boards[id], pev_sequence, 2); } else if(pev(id, pev_flags) & FL_ONGROUND && waterlevel == 0) { // Board on back set_pev(boards[id], pev_sequence, 1); } else if(pev(id, pev_movetype) == MOVETYPE_FLY || !shouldSurf[id] || waterlevel >= 3) { // Board under arm set_pev(boards[id], pev_sequence, 0); } return FMRES_HANDLED; }
public checkBoard(id) { if(!is_user_alive(id)) return FMRES_IGNORED; if(!hasBoard[id]) { // Give board hasBoard[id] = true; boards[id] = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")); set_pev(boards[id], pev_movetype, MOVETYPE_FOLLOW); set_pev(boards[id], pev_aiment, id); engfunc(EngFunc_SetModel, boards[id], BOARD_MODEL1); } else { client_print(id, print_chat, "Yo man, you already have a board!"); } return FMRES_HANDLED; }
////////////////////////////////////////////// // NPC STUFF ////////////////////////////////////////////// public npcMenu(id) { new name[33], text[512]; get_user_name(id, name, 32); format(text, 511, "Yo %s!^n^nWould you like a surf board?^n^n1: Yes - 2: No", name); show_menu(id, menuKeys, text, -1, "npcMenu"); return FMRES_HANDLED; }
public npcMenuEnter(id, key) { switch(key) { case 0: { // Key 1 checkBoard(id); inMenu[id] = false; } case 1: { // Key 2 inMenu[id] = false; } } }
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, "The ^"%s^" cvar was changed. The map must restart before inserting the NPC.", 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); // Give item give_item(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, "The NPC has been created and saved."); } } return FMRES_HANDLED; }
public give_item(ent) { g_weapon = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")); set_pev(g_weapon, pev_classname, "npc_weapon"); set_pev(g_weapon, pev_solid, SOLID_NOT); set_pev(g_weapon, pev_movetype, MOVETYPE_FOLLOW); set_pev(g_weapon, pev_aiment, ent); set_pev(g_weapon, pev_sequence, 1); engfunc(EngFunc_SetModel, g_weapon, BOARD_MODEL1); }
|