/* * WeaponMod Spawn Config Editor * * by GordonFreeman * http://www.lambda-force.org/ */ #include #include #include #include new editor,bool:handled,bool:loaded new Array:g_addname new Array:g_name new Array:g_coords new Array:g_config new sent,fwd new bool:cfgloaded,bool:cfgtype new ammoedited[32] new ammoeditor[4] public plugin_precache() precache_sound("buttons/bell1.wav") public plugin_init(){ register_plugin("WeaponMod Spawn Config Editor","0.5","GordonFreeman") register_clcmd("wpnmod_spawn","fw_StartEdit",ADMIN_RCON," - start weaponmod spawn editor") register_clcmd("set_ammo","SetAmmoData",ADMIN_RCON) } public fw_ConfigMenu(id){ if(!cfgloaded) fw_CfgLoader() new menu = menu_create("WeaponMod Config Editor","fw_CfgEditorHandler") new text[256] menu_additem(menu,"Equipment Config","equipment") menu_additem(menu,"Block Config","block") menu_additem(menu,"Ammo Config^n^nConfiguration:","ammo") new map[32] get_mapname(map,31) get_localinfo("amxx_configsdir",text,255) formatex(text,255,"%s/weaponmod/weaponmod%s%s.ini",text,cfgtype?"":"-",cfgtype?"":map) new existscfg = file_exists(text) formatex(text,255,"%s%s^n",cfgtype?"[ WeaponMod ]":"[ MapConfig ]",existscfg?"":"^n--> Config file will be created") menu_additem(menu,text,"cfgtype") menu_additem(menu,"Save Config","save") menu_display(id,menu) } public fw_ConfigEditorMenu(id,configtype,page){ new menu,stripped[62],info[6] new string[62],classname[32],style[2][5] switch(configtype){ case 1:{ menu = menu_create("WeaponMod Equipment Editor","fw_ProMenuHandler") for(new i;i0){ formatex(string,127,"^"%s^" ^"3^" ^"%d^" ^"%d^"",ammoedited,str_to_num(string),ammoeditor[1]) ArraySetString(g_config,ammoeditor[3],string) }else{ client_print(id,print_chat,"[WEAPONMOD] Max ammo value for %s is %d",ammoedited,ammoeditor[1]) } fw_ConfigEditorMenu(id,3,ammoeditor[2]) ammoedited[0] = 0 menu_destroy(ammoeditor[0]) ammoeditor[0] = 0 ammoeditor[1] = 0 ammoeditor[2] = 0 ammoeditor[3] = 0 return PLUGIN_HANDLED } public fw_CfgLoader(){ new Trie:g_repeated g_repeated = TrieCreate() g_config = ArrayCreate(42) new classname[32],temp[42] for(new i=1;i<=wpnmod_get_weapon_count();++i){ wpnmod_get_weapon_info(i,ItemInfo_szName,classname,31) if(!TrieKeyExists(g_repeated,classname)){ formatex(temp,41,"^"%s^" ^"1^" ^"0^"",classname) ArrayPushString(g_config,temp) TrieSetCell(g_repeated,classname,1) formatex(temp,41,"^"%s^" ^"2^" ^"0^"",classname) ArrayPushString(g_config,temp) }else continue wpnmod_get_weapon_info(i,ItemInfo_szAmmo1,classname,31) if(!classname[0]) continue if(!TrieKeyExists(g_repeated,classname)){ formatex(temp,41,"^"%s^" ^"3^" ^"0^" ^"%d^"",classname,wpnmod_get_weapon_info(i,ItemInfo_iMaxAmmo1)) ArrayPushString(g_config,temp) TrieSetCell(g_repeated,classname,1) }else continue wpnmod_get_weapon_info(i,ItemInfo_szAmmo2,classname,31) if(!classname[0]) continue if(!TrieKeyExists(g_repeated,classname)){ formatex(temp,41,"^"%s^" ^"3^" ^"0^" ^"%d^"",classname,wpnmod_get_weapon_info(i,ItemInfo_iMaxAmmo1)) ArrayPushString(g_config,temp) TrieSetCell(g_repeated,classname,1) }else continue } for(new i=1;i<=wpnmod_get_ammobox_count();++i){ wpnmod_get_ammobox_info(i,AmmoInfo_szName,classname,31) if(!TrieKeyExists(g_repeated,classname)){ formatex(temp,41,"^"%s^" ^"1^" ^"0^"",classname) ArrayPushString(g_config,temp) TrieSetCell(g_repeated,classname,1) formatex(temp,41,"^"%s^" ^"2^" ^"0^"",classname) ArrayPushString(g_config,temp) }else continue } TrieDestroy(g_repeated) cfgloaded = true new text[256],map[32] get_mapname(map,31) get_localinfo("amxx_configsdir",text,255) formatex(text,255,"%s/weaponmod/weaponmod%s%s.ini",text,cfgtype?"":"-",cfgtype?"":map) new file = fopen(text,"rt") if(!file) return new wtf[1],valuev[16],cuprev while(!feof(file)){ fgets(file,text,255) trim(text) if(text[0]&&text[0]!=';'){ parse(text,classname,31,wtf,0,valuev,15) if(!strcmp(classname,"[equipment]")){ cuprev = 1 continue } else if(!strcmp(classname,"[block]")){ cuprev = 2 continue } else if(!strcmp(classname,"[ammo]")){ cuprev = 3 continue } SetConfigValue(classname,cuprev,cuprev!=2?str_to_num(valuev):1) } } fclose(file) } public fw_CfgSaver(id){ new text[256],map[32] get_mapname(map,31) get_localinfo("amxx_configsdir",text,255) formatex(text,255,"%s/weaponmod/weaponmod%s%s.ini",text,cfgtype?"":"-",cfgtype?"":map) new file = fopen(text,"w+") fprintf(file,"; Weapon Mod Addon: Config Editor ^n") fprintf(file,"; %s - map configuration file^n",map) fprintf(file,"^n") new bool:passed new Array:datasaver = ArrayCreate(42) new classname[32],style[2][5] for(new i;i=360.0) angle[1]=0.0 set_pev(sent,pev_angles,angle) fw_PreSpawnMenu(id) } case 4:{ new Float:angle[3] pev(sent,pev_angles,angle) angle[0]+=15.0 if(angle[0]>=360.0) angle[0]=0.0 set_pev(sent,pev_angles,angle) fw_PreSpawnMenu(id) } case 3:{ if(fwd) unregister_forward(FM_PlayerPreThink,fwd) page = pev(sent,pev_iuser4) if(sent) engfunc(EngFunc_RemoveEntity,sent) fw_SpawnMenu(id,page) } } } case 'x':{ fw_DeletePost(id) } case 'q':{ fw_SaveSpawnPoints(id) } case 'j':{ client_cmd(id,"wp_spawn") } default:{ // catch marked item if(data[strlen(data)-1]=='z'){ data[strlen(data)-1] = 0 fw_PreSpawn(id,data,page) } } } return PLUGIN_HANDLED } public fw_EditorMenu(id){ new menu = menu_create("WeaponMod Spawner","fw_MenuHandler") menu_additem(menu,"Spawn Item","s1") menu_additem(menu,"Delete Item^n","s2") menu_additem(menu,"Config Editor","s4") if(is_plugin_loaded("weapon_framework.amxx",true)!=-1) menu_additem(menu,"Weapon FrameWork^n","j") menu_additem(menu,"Save Changes","q") editor = id handled = false menu_display(id,menu) } public fw_SpawnMenu(id,page){ if(sent){ sent = 0 } new menu = menu_create("Spawn Item","fw_MenuHandler") new classname[32],info[38] for(new i;i0.0){ set_pev(ent,pev_renderamt,amt) new data[2] data[0] = ent data[1] = floatround(amt) emit_sound(pev(ent,pev_owner),CHAN_STATIC,"buttons/bell1.wav",0.3,ATTN_NORM,0,PITCH_NORM) set_task(0.1,"fw_Working",_,data,2) } else{ new classname[32],Float:origin[3],Float:angles[3] pev(ent,pev_classname,classname,31) pev(ent,pev_origin,origin) pev(ent,pev_angles,angles) engfunc(EngFunc_RemoveEntity,ent) if(!strcmp(classname,"ammo_spore")){ angles[0] += 90.0 origin[2] -= 16.0 } wpnmod_create_item(classname,origin,angles) } } public fw_PlayerPreThink(id){ if(!sent){ unregister_forward(FM_PlayerPreThink,fwd) return FMRES_HANDLED } if(editor!=id) return FMRES_HANDLED new orig[3],Float:origin[3] get_user_origin(id,orig,3) origin[0] = float(orig[0]) origin[1] = float(orig[1]) origin[2] = float(orig[2]) set_pev(sent,pev_origin,origin) return FMRES_IGNORED } public fw_EditPreThink(id){ if(editor!=id) return FMRES_IGNORED new target = get_aiment(id) new classname[32],Float:origin[3],Float:angle[3] new wid pev(target,pev_classname,classname,31) pev(target,pev_origin,origin) pev(target,pev_angles,angle) if(target) wid = find_id_by_origin(classname,origin) set_hudmessage(255, 0, 0, 0.01, 0.14, 0, 6.0, 0.1,_,_,1) show_hudmessage(id, "Delete Item^nID: %d [%s]^nOrigin: [%.1f] [%.1f] [%.1f]^nAngles: [%.1f] [%.1f] [%.1f]^nCFG ID: %d",target,classname,origin[0],origin[1],origin[2],angle[0],angle[1],angle[2],wid) return FMRES_IGNORED } public fw_LoadSpawnPointsCfg(id){ g_addname = ArrayCreate(32) g_name = ArrayCreate(32) g_coords = ArrayCreate(6) new path[256],fpath[256],temp[128],classname[32],count get_localinfo("amxx_configsdir",path,255) formatex(path,255,"%s/weaponmod/spawnpoints/",path) if(!dir_exists(path)){ client_print(id,print_chat,"[WEAPNMOD] ^"%s^" is not found",path) return PLUGIN_HANDLED } // load registred weapons for(new i=1;i<=wpnmod_get_weapon_count();++i){ if(!wpnmod_get_weapon_info(i,ItemInfo_bCustom)) continue wpnmod_get_weapon_info(i,ItemInfo_szName,classname,31) ArrayPushString(g_addname,classname) count++ } // load registred ammo for(new i=1;i<=wpnmod_get_ammobox_count();++i){ wpnmod_get_ammobox_info(i,AmmoInfo_szName,classname,31) ArrayPushString(g_addname,classname) count++ } client_print(id,print_chat,"[WEAPONMOD] Loaded %d items to editing",count) count = 0 new map[96] get_mapname(map,31) formatex(fpath,255,"%s%s.ini",path,map) new file = fopen(fpath,"rt") if(!file){ loaded=true client_print(id,print_chat,"[WEAPONMOD] %s configuration file is not found",map) fw_EditorMenu(id) return PLUGIN_HANDLED } new sorig[20],sangle[20] new Float:origin[3],Float:angle[3],Float:all[7] while(!feof(file)){ fgets(file,temp,255) trim(temp) if(temp[0]&&!equali(temp,";",1)){ parse(temp,classname,31,sorig,20,sangle,20) ParseVec(sorig,19,origin) ParseVec(sangle,19,angle) all[0] = origin[0] all[1] = origin[1] all[2] = origin[2] all[3] = angle[0] all[4] = angle[1] all[5] = angle[2] ArrayPushString(g_name,classname) ArrayPushArray(g_coords,all) count++ } } client_print(id,print_chat,"[WEAPONMOD] Loaded %d items from %s configuration file",count,map) fclose(file) loaded=true fw_EditorMenu(id) return PLUGIN_HANDLED } // Parse Vector Function by KORD_12.7 ParseVec(szString[], iStringLen, Float: Vector[3]){ new i; new szTemp[32]; arrayset(_:Vector, 0, 3); while (szString[0] != 0 && strtok(szString, szTemp, charsmax(szTemp), szString, iStringLen, ' ', 1)) { Vector[i++] = str_to_float(szTemp); } } stock traceline( const Float:vStart[3], const Float:vEnd[3], const pIgnore, Float:vHitPos[3] ){ engfunc( EngFunc_TraceLine, vStart, vEnd, 0, pIgnore, 0 ) get_tr2( 0, TR_vecEndPos, vHitPos ) return get_tr2( 0, TR_pHit ) } stock get_view_pos( const id, Float:vViewPos[3] ){ new Float:vOfs[3] pev( id, pev_origin, vViewPos ) pev( id, pev_view_ofs, vOfs ) vViewPos[0] += vOfs[0] vViewPos[1] += vOfs[1] vViewPos[2] += vOfs[2] } stock Float:vel_by_aim( id, speed = 1 ){ new Float:v1[3], Float:vBlah[3] pev( id, pev_v_angle, v1 ) engfunc( EngFunc_AngleVectors, v1, v1, vBlah, vBlah ) v1[0] *= speed v1[1] *= speed v1[2] *= speed return v1 } stock get_aiment(id){ new target new Float:orig[3], Float:ret[3] get_view_pos( id, orig ) ret = vel_by_aim( id, 9999 ) ret[0] += orig[0] ret[1] += orig[1] ret[2] += orig[2] target = traceline( orig, ret, id, ret ) new movetype if( target && pev_valid( target ) ) { movetype = pev( target, pev_movetype ) if( !( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) ) return 0 } else { target = 0 new ent = engfunc( EngFunc_FindEntityInSphere, -1, ret, 10.0 ) while( !target && ent > 0 ) { movetype = pev( ent, pev_movetype ) if( ( movetype == MOVETYPE_WALK || movetype == MOVETYPE_STEP || movetype == MOVETYPE_TOSS ) && ent != id ) target = ent ent = engfunc( EngFunc_FindEntityInSphere, ent, ret, 10.0 ) } } if(0