Czy ktoś może mi powiedzieć dlaczego ten plugin nie chce działać?
/* AMXX PLUGIN Pallets with Bags Version : 0.3c Author : SAMURAI Have a nice day now */ #include <amxmodx> #include <amxmisc> #include <fakemeta> #include <xs> #define PLUGIN_NAME "Pallets with Bags" #define PLUGIN_VERSION "0.3c" #define PLUGIN_AUTHOR "SAMURAI" // The sizes of models #define PALLET_MINS Float:{ -27.260000, -22.280001, -22.290001 } #define PALLET_MAXS Float:{ 27.340000, 26.629999, 29.020000 } // from fakemeta util by VEN #define fm_find_ent_by_class(%1,%2) engfunc(EngFunc_FindEntityByString, %1, "classname", %2) #define fm_remove_entity(%1) engfunc(EngFunc_RemoveEntity, %1) // this is mine #define fm_drop_to_floor(%1) engfunc(EngFunc_DropToFloor,%1) // cvars new pnumplugin, remove_nrnd, maxpallets, phealth; // num of pallets with bags new palletscout = 0; /* Models for pallets with bags . Are available 2 models, will be set a random of them */ new g_models[][] = { "models/pallet_with_bags.mdl", "models/pallet_with_bags2.mdl" } new g_class[] = "amxx_pallets"; /************************************************************* ************************* AMXX PLUGIN ************************* **************************************************************/ public plugin_init() { /* Register the plugin */ register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR) /* Register the cvars */ pnumplugin = register_cvar("pallets_wbags","1"); // 1 = ON ; 0 = OFF remove_nrnd = register_cvar("pallets_wbags_nroundrem","0"); maxpallets = register_cvar("pallets_wbags_max","64"); // max number of pallets with bags phealth = register_cvar("pallets_wbags_health","0"); // set the health to a pallet with bags /* Game Events */ register_event("HLTV","event_newround", "a","1=0", "2=0"); // it's called every on new round /* This is for menuz: */ register_menucmd(register_menuid("yPallets with Bags:"), 1023, "menu_command" ); register_clcmd("say pallets_menu","show_the_menu",ADMIN_RCON,"Open the Pallets with Bags menu"); } public plugin_precache() { for(new i;i < sizeof g_models;i++) engfunc(EngFunc_PrecacheModel,g_models[i]); } public show_the_menu(id,level,cid) { // check if user doesen't have admin if( ! cmd_access( id,level, cid , 0 )) return PLUGIN_HANDLED; // check if the plugin cvar is turned off if( ! get_pcvar_num( pnumplugin ) ) return PLUGIN_HANDLED; // check if user isn't alive if( ! is_user_alive( id ) ) { client_print( id, print_chat, "[PE] Nie mozesz postawic workow, poniewaz nie zyjesz!" ); return PLUGIN_HANDLED; } new szMenuBody[256]; new keys; new nLen = format( szMenuBody, 255, "y[PE] Worki:^n" ); nLen += format( szMenuBody[nLen], 255-nLen, "^nw1. Poloz worek" ); nLen += format( szMenuBody[nLen], 255-nLen, "^nw2. Usun dany worek" ); nLen += format( szMenuBody[nLen], 255-nLen, "^nw3. Usun wszystkie worki z serwera" ); nLen += format( szMenuBody[nLen], 255-nLen, "^nw4. Zapisz postawione worki" ); nLen += format( szMenuBody[nLen], 255-nLen, "^n^nw0. Wyjdz" ); keys = (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<9) show_menu( id, keys, szMenuBody, -1 ); // depends what you want, if is continue will appear on chat what the admin sayd return PLUGIN_HANDLED; } public plugin_cfg() { static sConfigsDir[256], sFile[256], PalletDir[256]; get_configsdir(sConfigsDir, sizeof sConfigsDir - 1); static sMapName[32]; get_mapname(sMapName, sizeof sMapName - 1); formatex(PalletDir, sizeof PalletDir - 1,"%s/Pallets with Bags",sConfigsDir); formatex(sFile, sizeof sFile - 1, "%s/%s_pallets_with_bags.cfg",PalletDir,sMapName); //formatex(sFile, sizeof sFile - 1, "%s/%s_pallets_with_bags.cfg", sConfigsDir, sMapName); if(!dir_exists(PalletDir)) { mkdir(PalletDir); } if(!file_exists(sFile)) { write_file(sFile,""); } static sFileOrigin[3][32], sFileAngles[3][32], iLine, iLength, sBuffer[256]; static sTemp1[128], sTemp2[128]; static Float:fOrigin[3], Float:fAngles[3]; while(read_file(sFile, iLine++, sBuffer, sizeof sBuffer - 1, iLength)) { if((sBuffer[0]==';') || !iLength) continue; strtok(sBuffer, sTemp1, sizeof sTemp1 - 1, sTemp2, sizeof sTemp2 - 1, '|', 0); parse(sTemp1, sFileOrigin[0], sizeof sFileOrigin[] - 1, sFileOrigin[1], sizeof sFileOrigin[] - 1, sFileOrigin[2], sizeof sFileOrigin[] - 1); fOrigin[0] = str_to_float(sFileOrigin[0]); fOrigin[1] = str_to_float(sFileOrigin[1]); fOrigin[2] = str_to_float(sFileOrigin[2]); parse(sTemp2, sFileAngles[0], sizeof sFileAngles[] - 1, sFileAngles[1], sizeof sFileAngles[] - 1, sFileAngles[2], sizeof sFileAngles[] - 1); fAngles[0] = str_to_float(sFileAngles[0]); fAngles[1] = str_to_float(sFileAngles[1]); fAngles[2] = str_to_float(sFileAngles[2]); ///////////////////////////////////////////////////////////////////// if( palletscout == get_pcvar_num(maxpallets) ) { server_print("Can't be placed more than %d pallets with bags",get_pcvar_num(maxpallets)); return 0; } new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_wall")); engfunc(EngFunc_SetOrigin, ent, fOrigin); if(!ent) return 0; engfunc(EngFunc_SetModel,ent,g_models[random(sizeof g_models)]); set_pev(ent,pev_classname,g_class); dllfunc(DLLFunc_Spawn, ent); set_pev(ent,pev_solid,SOLID_BBOX); // set the movetype set_pev(ent,pev_movetype,MOVETYPE_FLY); // no gravity, but still collides with stuff // set sizes static Float:p_mins[3], Float:p_maxs[3]; p_mins = PALLET_MINS; p_maxs = PALLET_MAXS; engfunc(EngFunc_SetSize, ent, p_mins, p_maxs); set_pev(ent, pev_mins, p_mins); set_pev(ent, pev_maxs, p_maxs ); set_pev(ent, pev_absmin, p_mins); set_pev(ent, pev_absmax, p_maxs ); // now the damage stuff, to set to take it or no // if you set the cvar "pallets_wbags_health" 0, you can't destroy a pallet with bags // else, if you want to make it destroyable, just set the health > 0 and will be // destroyable. new Float:p_cvar_health = get_pcvar_float(phealth); switch(p_cvar_health) { case 0.0 : { set_pev(ent,pev_takedamage,DAMAGE_NO); } default : { set_pev(ent,pev_health,p_cvar_health); set_pev(ent,pev_takedamage,DAMAGE_YES); } } set_pev(ent,pev_angles,fAngles); // drop entity to floor fm_drop_to_floor(ent); // num .. palletscout++; } return 1; } public menu_command(id,key,level,cid) { switch( key ) { // place a pallet with bags case 0: { place_palletwbags(id); show_the_menu(id,level,cid); } // remove a pallet with bags case 1: { new ent, body, class[32]; get_user_aiming(id, ent, body); if (pev_valid(ent)) { pev(ent, pev_classname, class, 31); if (equal(class, g_class)) { fm_remove_entity(ent); palletscout--; } else client_print(id, print_chat, "[AMXX] You are not aiming at a pallet with bags"); } else client_print(id, print_chat, "[AMXX] You are not aiming at a valid entity !"); show_the_menu(id,level,cid); } // remove all pallets with bags case 2: { remove_allpalletswbags(); client_print(id,print_chat,"[AMXX] You removed all pallets with bags !"); show_the_menu(id,level,cid); } // save origins case 3: { static sConfigsDir[256], sFile[256], PalletDir[256]; get_configsdir(sConfigsDir, sizeof sConfigsDir - 1); static sMapName[32]; get_mapname(sMapName, sizeof sMapName - 1); formatex(PalletDir, sizeof PalletDir - 1,"%s/Pallets with Bags",sConfigsDir); formatex(sFile, sizeof sFile - 1, "%s/%s_pallets_with_bags.cfg",PalletDir,sMapName); if(file_exists(sFile)) delete_file(sFile); new iEnt = -1, Float:fEntOrigin[3], Float:fEntAngles[3], iCount; static sBuffer[256]; while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", g_class))) { pev(iEnt, pev_origin, fEntOrigin); pev(iEnt, pev_angles, fEntAngles); formatex(sBuffer, sizeof sBuffer - 1, "%f %f %f | %f %f %f", fEntOrigin[0], fEntOrigin[1], fEntOrigin[2], fEntAngles[0], fEntAngles[1], fEntAngles[2]); write_file(sFile, sBuffer, -1); iCount++; } client_print(id, print_chat, "[AMXX] Successfuly saved all pallets with bags origins (%d) for map %s!", iCount,sMapName); show_the_menu(id,level,cid); } } return PLUGIN_HANDLED; } public place_palletwbags(id) { if( palletscout == get_pcvar_num(maxpallets) ) { client_print(id,print_chat,"You can't place more than %d pallets with bags",get_pcvar_num(maxpallets)); return PLUGIN_HANDLED; } // create a new entity new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_wall")); // set a name to the entity set_pev(ent,pev_classname,g_class); // set model engfunc(EngFunc_SetModel,ent,g_models[random(sizeof g_models)]); // register a new var. for origin static Float:xorigin[3]; get_user_hitpoint(id,xorigin); // check if user is aiming at the air if(engfunc(EngFunc_PointContents,xorigin) == CONTENTS_SKY) { client_print(id,print_chat,"[AMXX] You can't place a pallet with bags on the air"); return PLUGIN_HANDLED; } // set sizes static Float:p_mins[3], Float:p_maxs[3]; p_mins = PALLET_MINS; p_maxs = PALLET_MAXS; engfunc(EngFunc_SetSize, ent, p_mins, p_maxs); set_pev(ent, pev_mins, p_mins); set_pev(ent, pev_maxs, p_maxs ); set_pev(ent, pev_absmin, p_mins); set_pev(ent, pev_absmax, p_maxs ); // set the rock of origin where is user placed engfunc(EngFunc_SetOrigin, ent, xorigin); // make the rock solid set_pev(ent,pev_solid,SOLID_BBOX); // touch on edge, block // set the movetype set_pev(ent,pev_movetype,MOVETYPE_FLY); // no gravity, but still collides with stuff // now the damage stuff, to set to take it or no // if you set the cvar "pallets_wbags_health" 0, you can't destroy a pallet with bags // else, if you want to make it destroyable, just set the health > 0 and will be // destroyable. new Float:p_cvar_health = get_pcvar_float(phealth); switch(p_cvar_health) { case 0.0 : { set_pev(ent,pev_takedamage,DAMAGE_NO); } default : { set_pev(ent,pev_health,p_cvar_health); set_pev(ent,pev_takedamage,DAMAGE_YES); } } static Float:rvec[3]; pev(id,pev_v_angle,rvec); rvec[0] = 0.0; set_pev(ent,pev_angles,rvec); // drop entity to floor fm_drop_to_floor(ent); // num .. palletscout++; // confirm message client_print(id,print_chat,"[AMXX] You placed a Pallet with Bags !"); return PLUGIN_HANDLED; } /* ==================================================== get_user_hitpoin stock . Was maked by P34nut, and is like get_user_aiming but is with floats and better <img src='https://amxx.pl/public/style_emoticons/<#EMO_DIR#>/ohmy.gif' class='bbc_emoticon' alt=':o' /> ====================================================*/ stock get_user_hitpoint(id, Float:hOrigin[3]) { if ( ! is_user_alive( id )) return 0; new Float:fOrigin[3], Float:fvAngle[3], Float:fvOffset[3], Float:fvOrigin[3], Float:feOrigin[3]; new Float:fTemp[3]; pev(id, pev_origin, fOrigin); pev(id, pev_v_angle, fvAngle); pev(id, pev_view_ofs, fvOffset); xs_vec_add(fOrigin, fvOffset, fvOrigin); engfunc(EngFunc_AngleVectors, fvAngle, feOrigin, fTemp, fTemp); xs_vec_mul_scalar(feOrigin, 9999.9, feOrigin); xs_vec_add(fvOrigin, feOrigin, feOrigin); engfunc(EngFunc_TraceLine, fvOrigin, feOrigin, 0, id); global_get(glb_trace_endpos, hOrigin); return 1; } /* ==================================================== This is called on every round, at start up, with HLTV logevent. So if the "pallets_wbags_nroundrem" cvar is set to 1, all placed pallets with bags will be removed. ====================================================*/ public event_newround() { if( get_pcvar_num ( remove_nrnd ) == 1) remove_allpalletswbags(); } /* ==================================================== This is a stock to help for remove all pallets with bags placed . Is called on new round if the cvar "pallets_wbags_nroundrem" is set 1. ====================================================*/ stock remove_allpalletswbags() { new pallets = -1; while((pallets = fm_find_ent_by_class(pallets, g_class))) fm_remove_entity(pallets); palletscout = 0; }
Z góry dziękuję. :>