WeaponMod Spawn Config Editor

WeaponMod Spawn Config Editor 0.5

Нет прав для скачивания
Код:
/*
*    WeaponMod Spawn Config Editor
*
*                        by GordonFreeman
*                http://www.lambda-force.org/
*/

#include <amxmodx>
#include <amxmisc>
#include <hl_wpnmod>
#include <fakemeta>

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;i<ArraySize(g_config);++i){
                ArrayGetString(g_config,i,string,62)
              
                parse(string,classname,31,style[0],4,style[1],4)
              
                if(str_to_num(style[0])!=1)
                    continue
                  
                formatex(stripped,61,"%s [ %d ]",classname,str_to_num(style[1]))
              
                formatex(info,5,"e%d",i)
              
                menu_additem(menu,stripped,info)
            }
          
            menu_display(id,menu,page)
        }
        case 2:{
            menu = menu_create("WeaponMod Block Editor","fw_ProMenuHandler")
  
            for(new i;i<ArraySize(g_config);++i){
                ArrayGetString(g_config,i,string,62)
              
                parse(string,classname,31,style[0],4,style[1],4)
              
                if(str_to_num(style[0])!=2)
                    continue
                  
                formatex(stripped,61,"%s [ %s ]",classname,str_to_num(style[1])?"ON":"OFF")
              
                formatex(info,5,"b%d",i)
              
                menu_additem(menu,stripped,info)
            }
          
            menu_display(id,menu,page)
        }
        case 3:{
            menu = menu_create("WeaponMod Ammo Editor","fw_ProMenuHandler")
  
            for(new i;i<ArraySize(g_config);++i){
                ArrayGetString(g_config,i,string,62)
              
                parse(string,classname,31,style[0],4,style[1],4)
              
                if(str_to_num(style[0])!=3)
                    continue
                  
                formatex(stripped,61,"%s [ %d ]",classname,str_to_num(style[1]))
              
                formatex(info,5,"a%d",i)
              
                menu_additem(menu,stripped,info)
            }
          
            menu_display(id,menu,page)
        }
    }
  
    return PLUGIN_HANDLED
}

public fw_ProMenuHandler(id,menu,item){
    if(item==MENU_EXIT){
        menu_destroy(menu)
      
        fw_ConfigMenu(id)
      
        return PLUGIN_HANDLED
    }
  
    new data[38],name[64]
    new access,callback,page
  
    menu_item_getinfo(menu,item,access,data,37,name,63,callback)
    player_menu_info(id,menu,menu,page)
  
    new string[62],classname[32],style[3][5]
  
    switch(data[0]){
        case 'e':{
            replace(data,4,"e","")
          
            ArrayGetString(g_config,str_to_num(data),string,62)
          
            parse(string,classname,31,style[0],4,style[1],4)
          
            formatex(string,61,"^"%s^" ^"%d^" ^"%d^"",classname,str_to_num(style[0]),str_to_num(style[1])<10?str_to_num(style[1])+1:0)
          
            ArraySetString(g_config,str_to_num(data),string)
          
            fw_ConfigEditorMenu(id,1,page)
        }
        case 'b':{
            replace(data,4,"b","")
          
            ArrayGetString(g_config,str_to_num(data),string,62)
          
            parse(string,classname,31,style[0],4,style[1],4)
          
            formatex(string,61,"^"%s^" ^"%d^" ^"%d^"",classname,str_to_num(style[0]),str_to_num(style[1])?0:1)
          
            ArraySetString(g_config,str_to_num(data),string)
          
            fw_ConfigEditorMenu(id,2,page)
        }
        case 'a':{
            replace(data,4,"a","")
          
            ArrayGetString(g_config,str_to_num(data),string,62)
          
            parse(string,classname,31,style[0],4,style[1],4,style[2],4)
          
            AttemptSetAmmoData(id,classname,str_to_num(data),str_to_num(style[1]),str_to_num(style[2]),page)
        }
    }
  
    return PLUGIN_HANDLED
}

public AttemptSetAmmoData(id,ammoname[],cfgid,current,maxammo,page){
    ammoeditor[0] = menu_create("Set Ammo Value","AmmoMenuHandler")
    ammoeditor[1] = maxammo
    ammoeditor[2] = page
    ammoeditor[3] = cfgid
  
    formatex(ammoedited,31,ammoname)
  
    menu_setprop(ammoeditor[0],MPROP_EXIT,MEXIT_NEVER)
  
    new text[102]
    formatex(text,101,"by GordonFreeman")
  
    menu_additem(ammoeditor[0],text)
  
    formatex(text,101,"Set startup ammo value for:^n   [ %s ] [ %d/%d ]",ammoname,current,maxammo)
    menu_addtext(ammoeditor[0],text)
  
    menu_display(id,ammoeditor[0])
  
    client_cmd(id,"messagemode set_ammo")
}

public AmmoMenuHandler(id,menu,item){
    if(item==MENU_EXIT)
        return PLUGIN_HANDLED
  
    menu_display(id,menu)
  
    return PLUGIN_HANDLED
}

public SetAmmoData(id){
    if(ammoeditor[0]<=0)
        return PLUGIN_HANDLED
      
    new string[128]
    read_args(string,127)
    remove_quotes(string)
  
    new ammo = str_to_num(string)
  
    if(ammo<=ammoeditor[1]&&ammo!=0&&ammo>0){
        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<ArraySize(g_config);++i){
        ArrayGetString(g_config,i,text,255)
      
        parse(text,classname,31,style[0],4,style[1],4)
      
        if(str_to_num(style[0])!=1)
            continue
          
        if(!str_to_num(style[1]))
            continue
          
        if(!passed)
            passed = true
          
        formatex(text,255,"%s %s",classname,style[1])
        ArrayPushString(datasaver,text)
    }
  
    if(passed){
        fprintf(file,"; Set start weapons and items for player on spawn.^n")
        fprintf(file,"[equipment]^n")
    }
  
    for(new i;i<ArraySize(datasaver);++i){
        ArrayGetString(datasaver,i,text,255)
      
        parse(text,classname,31,style[0],4)
      
        fprintf(file,"%s : %s^n",classname,style[0])
    }
  
    ArrayClear(datasaver)
    passed = false
  
    for(new i;i<ArraySize(g_config);++i){
        ArrayGetString(g_config,i,text,255)
      
        parse(text,classname,31,style[0],4,style[1],4)
      
        if(str_to_num(style[0])!=2)
            continue
          
        if(!str_to_num(style[1]))
            continue
          
        if(!passed)
            passed = true
      
        ArrayPushString(datasaver,classname)
    }
  
    if(passed){
        fprintf(file,"^n; Set block for default weapons and ammoboxes.^n")
        fprintf(file,"[block]^n")
    }
  
    for(new i;i<ArraySize(datasaver);++i){
        ArrayGetString(datasaver,i,text,255)
      
        fprintf(file,"%s^n",text)
    }
  
    ArrayClear(datasaver)
    passed = false
  
    for(new i;i<ArraySize(g_config);++i){
        ArrayGetString(g_config,i,text,255)
      
        parse(text,classname,31,style[0],4,style[1],4)
      
        if(str_to_num(style[0])!=3)
            continue
          
        if(!str_to_num(style[1]))
            continue
          
        if(!passed)
            passed = true
          
        formatex(text,255,"%s %s",classname,style[1])
        ArrayPushString(datasaver,text)
    }
  
    if(passed){
        fprintf(file,"^n; Set start ammo for player on spawn.^n")
        fprintf(file,"[ammo]^n")
    }
  
    for(new i;i<ArraySize(datasaver);++i){
        ArrayGetString(datasaver,i,text,255)
      
        parse(text,classname,31,style[0],4)
      
        fprintf(file,"%s : %s^n",classname,style[0])
    }
  
    ArrayDestroy(datasaver)
  
    fprintf(file,"^n")
    fprintf(file,";^n")
    fprintf(file,"; by GordonFreeman^n")
    fprintf(file,"; http://aghl.ru/forum/")
  
    fclose(file)
  
    fw_ConfigMenu(id)
    client_print(id,print_chat,"[WEAPONMOD] Configuration file for %s map saved!",map)
}

SetConfigValue(classname[],type,value){
    new string[62]
  
    new classnamepro[32],style[2][5]
  
    if(type==2){
        formatex(string,61,"^"%s^" ^"%d^" ^"%d^"",classname,type,value)
        ArrayPushString(g_config,string)
      
        return
    }
  
    for(new i;i<ArraySize(g_config);++i){
        ArrayGetString(g_config,i,string,61)
      
        parse(string,classnamepro,31,style[0],4,style[1],4)
      
        if(strcmp(classnamepro,classname))
            continue
          
        if(str_to_num(style[0])!=type)
            continue
          
        formatex(string,61,"^"%s^" ^"%d^" ^"%d^"",classname,type,value)
        ArraySetString(g_config,i,string)
      
        break
    }
}

public fw_CfgEditorHandler(id,menu,item){
    if(item==MENU_EXIT){
        ArrayDestroy(g_config)
        cfgloaded = false
      
        menu_destroy(menu)
      
        fw_EditorMenu(id)
      
        return PLUGIN_HANDLED
    }
  
    new data[38],name[64]
    new access,callback
  
    menu_item_getinfo(menu,item,access,data,37,name,63,callback)
  
    if(!strcmp(data,"equipment")){
        fw_ConfigEditorMenu(id,1,0)
          
        return PLUGIN_HANDLED
    }else if(!strcmp(data,"block")){
        fw_ConfigEditorMenu(id,2,0)
          
        return PLUGIN_HANDLED
    }else if(!strcmp(data,"ammo")){
        fw_ConfigEditorMenu(id,3,0)
          
        return PLUGIN_HANDLED
    }else if(!strcmp(data,"cfgtype")){
        ArrayDestroy(g_config)
        cfgloaded = false
        cfgtype = cfgtype?false:true
          
        fw_ConfigMenu(id)
          
        return PLUGIN_HANDLED
    }else if(!strcmp(data,"save")){
        fw_CfgSaver(id)
      
        return PLUGIN_HANDLED
    }
  
    return PLUGIN_HANDLED
}

public fw_StartEdit(id,level,cid){
    if(!cmd_access(id,level,cid,1))
        return PLUGIN_HANDLED
  
    if(!loaded){
        new menu = menu_create("Start Editor?","fw_MenuHandler")
        menu_additem(menu,"Yes","y1")
        menu_additem(menu,"No","y2")
      
        menu_setprop(menu,MPROP_EXIT,MEXIT_NEVER)
      
        menu_display(id,menu)
    }else{
        fw_EditorMenu(id)
    }
  
    return PLUGIN_HANDLED
}

public fw_MenuHandler(id,menu,item){
    if(item==MENU_EXIT){
        menu_destroy(menu)
      
        if(fwd)
            unregister_forward(FM_PlayerPreThink,fwd)
      
        if(sent)
            engfunc(EngFunc_RemoveEntity,sent)
          
        editor = 0
      
        if(handled)
            fw_EditorMenu(id)
        else{
            set_hudmessage(255, 170, 0, -1.0, 0.30, 0, 6.0, 12.0)
            show_hudmessage(id, "Dont forget save your spawnpoints!")
        }
      
        return PLUGIN_HANDLED
    }
  
    new data[38],name[64]
    new access,callback,page
  
    menu_item_getinfo(menu,item,access,data,37,name,63,callback)
    player_menu_info(id,menu,menu,page)
  
    new key = str_to_num(data[1])
  
    switch(data[0]){
        case 'y':{
            switch(key){
                case 1: fw_LoadSpawnPointsCfg(id)
                case 2: menu_destroy(menu)
            }
        }
        case 's':{
            switch(key){
                case 1: fw_SpawnMenu(id,page)
                case 2: fw_DeleteMenu(id)
                case 4: fw_ConfigMenu(id)
            }
        }
        case 'h':{
            switch(key){
                case 1:{
                    fw_Spawn(id)
                }
                case 2:{
                    new Float:angle[3]
                    pev(sent,pev_angles,angle)
  
                    angle[1]+=15.0
      
                    if(angle[1]>=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;i<ArraySize(g_addname);++i){
        ArrayGetString(g_addname,i,classname,32)
      
        formatex(info,37,"%sz",classname)    // mark them for menu handler
      
        menu_additem(menu,classname,info)
    }
  
    handled = true
  
    menu_display(id,menu,page)
}

public fw_DeleteMenu(id){
    if(!fwd)
        fwd = register_forward(FM_PlayerPreThink,"fw_EditPreThink")
    else{
        unregister_forward(FM_PlayerPreThink,fwd)
        fwd = register_forward(FM_PlayerPreThink,"fw_EditPreThink")
    }
  
    new menu = menu_create("Delte Item","fw_MenuHandler")
    menu_additem(menu,"Delete It^n","x")
  
    handled = true
  
    menu_display(id, menu, 0)
}

public fw_DeletePost(id){
    new target = get_aiment(id)
  
    if(!target){
        fw_DeleteMenu(id)
      
        return PLUGIN_HANDLED
    }
  
    new classname[32],Float:origin[3],wid
  
    pev(target,pev_classname,classname,31)
    pev(target,pev_origin,origin)
  
    if(target)
        wid = find_id_by_origin(classname,origin)
      
    set_pev(target,pev_renderfx,kRenderFxGlowShell)
    set_pev(target,pev_rendermode,kRenderNormal)
    set_pev(target,pev_rendercolor,{255.0,0.0,0.0})
    set_pev(target,pev_renderamt,96.0)
      
    set_pev(target,pev_movetype,MOVETYPE_NONE)
    set_pev(target,pev_nextthink,1.0)
    set_pev(target,pev_solid,SOLID_NOT)
  
    ArraySetString(g_name,wid,"yandex")
  
    fw_DeleteMenu(id)
  
    return PLUGIN_HANDLED
}

public fw_SaveSpawnPoints(id){
    new classname[32],Float:origin[3],Float:angle[3],Float:sorg[6]
  
    new path[256],count
  
    get_localinfo("amxx_configsdir",path,255)
    formatex(path,255,"%s/weaponmod/spawnpoints/",path)
  
    new map[32]
    get_mapname(map,31)
  
    formatex(path,255,"%s%s.ini",path,map)
  
    new file = fopen(path,"w+")
    if(!file) return
  
    fprintf(file,"; Weapon Mod Addon: Item Spawner^n")
    fprintf(file,"; %s - map configuration file^n",map)
    fprintf(file,"^n")
  
    if(ArraySize(g_name)){
        fprintf(file,"^n;Item        origin (xyz)        angles (pyr)^n")
        for(new i;i<ArraySize(g_name);++i){
            ArrayGetString(g_name,i,classname,31)
          
            if(equal(classname,"yandex"))
                continue
              
            fprintf(file,"%s    ",classname)
          
            ArrayGetArray(g_coords,i,sorg)
          
            origin[0] = sorg[0]
            origin[1] = sorg[1]
            origin[2] = sorg[2]
            angle[0] = sorg[3]
            angle[1] = sorg[4]
            angle[2] = sorg[5]
          
            fprintf(file,"^"%.0f %.0f %.0f^"    ^"%.0f %.0f %.0f^"^n",origin[0],origin[1],origin[2],angle[0],angle[1],angle[2])
          
            count ++
        }
      
        fprintf(file,"^n")
    }
  
    fprintf(file,"^n")
    fprintf(file,";^n")
    fprintf(file,"; by GordonFreeman^n")
    fprintf(file,"; http://aghl.ru/forum/")
  
    fclose(file)
  
    set_hudmessage(255, 170, 0, -1.0, 0.30, 0, 6.0, 12.0)
    show_hudmessage(id, "Saved!")
  
    client_print(id,print_chat,"[WEAPONMOD] Total %d items saved for %s map",count,map)
  
    return
}

public fw_PreSpawn(id,classname[],page){
    if(fwd||sent){
        engfunc(EngFunc_RemoveEntity,sent)
        sent = 0
        unregister_forward(FM_PlayerPreThink,fwd)
    }
  
    new Float:origin[3],org[3]
  
    get_user_origin(id,org,3)
  
    origin[0] = float(org[0])
    origin[1] = float(org[1])
    origin[2] = float(org[2])
  
    sent = wpnmod_create_item(classname,origin)

    if(sent<0)
        return PLUGIN_HANDLED
  
    set_pev(sent,pev_renderfx,kRenderFxDistort)
    set_pev(sent,pev_rendermode,kRenderTransAdd)
    set_pev(sent,pev_renderamt,128.0)
  
    set_pev(sent,pev_movetype,MOVETYPE_FLY)
    set_pev(sent,pev_nextthink,0.0)
    set_pev(sent,pev_solid,SOLID_NOT)
  
    // mark for page handler
    set_pev(sent,pev_iuser4,page)
  
    fwd = register_forward(FM_PlayerPreThink,"fw_PlayerPreThink")
  
    fw_PreSpawnMenu(id)
  
    return PLUGIN_HANDLED
}

public fw_PreSpawnMenu(id){
    new title[32]
    pev(sent,pev_classname,title,31)
  
    replace_all(title,32,"weapon_","")
    replace_all(title,32,"ammo_","")
    replace_all(title,32,"item_","")
    ucfirst(title)
  
    format(title,31,"Spawn %s",title)
    new menu = menu_create(title,"fw_MenuHandler")
  
    menu_additem(menu,"Spawn It","h1")
    menu_additem(menu,"Change Yaw Angle","h2")
    menu_additem(menu,"Change Pitch Angle^n","h4")
    menu_additem(menu,"Cancel","h3")
  
    menu_display(id,menu)
}

public fw_Spawn(id){
    if(!sent){
        set_hudmessage(255, 0, 0, -1.0, 0.60, 0, 6.0, 12.0)
        show_hudmessage(id, "Adding Failed, no enitity is selected")
      
        if(fwd)
            unregister_forward(FM_PlayerPreThink,fwd)
      
        return
    }
  
  
    new Float:origin[3],Float:angle[3],Float:all[6],classname[32]
  
    pev(sent,pev_origin,origin)
    pev(sent,pev_classname,classname,31)
    pev(sent,pev_angles,angle)
  
    if(!strcmp(classname,"ammo_spore")){
            angle[0] += 90.0
            origin[2] -= 16.0
    }
  
    set_hudmessage(128, 255, 0, -1.0, 0.60, 0, 6.0, 12.0)
    show_hudmessage(id, "Spawn position added^n[%.2f %.2f %.2f]",origin[0],origin[1],origin[2])
  
    set_pev(sent,pev_renderfx,kRenderFxGlowShell)
    set_pev(sent,pev_rendermode,kRenderNormal)
    set_pev(sent,pev_rendercolor,{128.0,255.0,0.0})
    set_pev(sent,pev_renderamt,160.0)
    set_pev(sent,pev_owner,id)
  
    new data[2]
    data[0] = sent
    data[1] = 160
      
    set_task(0.1,"fw_Working",_,data,2)
  
    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)
  
    if(fwd)
        unregister_forward(FM_PlayerPreThink,fwd)
  
    fw_SpawnMenu(id,pev(sent,pev_iuser4))
}

public fw_Working(data[2]){
    new ent = data[0]
    new Float:amt = float(data[1])
  
    amt -= 25.5
  
    new Float:angles[3]
    pev(ent,pev_angles,angles)
  
    if(amt>0.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<target<=get_maxplayers())
        return 0
  
    new classname[32]
    pev(target,pev_classname,classname,31)
  
    if(equal(classname,"weaponbox"))
        return 0
  
    return target
}

stock find_id_by_origin(classname[],Float:origin[3]){
    new Float:all[8],cl[32]
  
    for(new i;i<ArraySize(g_name);++i){
        ArrayGetString(g_name,i,cl,31)
        ArrayGetArray(g_coords,i,all)
      
        if(!equal(cl,classname))
            continue
                      
        if(all[0]!=origin[0]||all[1]!=origin[1])
            continue
          
        return i
    }
  
    return 0
}
Назад
Верх