Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

The problem of disappearingThe problem of disappearing

basebuilder

  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
1 odpowiedź w tym temacie

#1 milad512

    Nowy

  • Użytkownik

Reputacja: 3
Nowy

  • Postów:6
  • Imię:milad
Offline

Napisano 01.04.2020 17:06

Hi
With the increasing number of ent copies, objects disappear

#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <engine>
#include <fakemeta>
#include <cellarray>

#define MAXENTS 1365
#define SAVEPATH "addons/amxmodx/data/entsaves"

new Array:entvars [MAXENTS]
new weaponmode [33]

public plugin_init(){
    register_plugin("Ent Moving","1.7","Ingram")
    
    register_clcmd("+moveent","startmoving",ADMIN_LEVEL_G," - Begin moving an ent")
    register_clcmd("+moveentaim","startmoving",ADMIN_LEVEL_G," - Begin moving an ent by aiming")
    register_clcmd("+copyent","startmoving",ADMIN_LEVEL_G," - Copy an ent and begin moving")
    register_clcmd("+copyentaim","startmoving",ADMIN_LEVEL_G," - Copy an ent and begin moving by aiming")
    register_clcmd("-moveent","stopmoving")
    register_clcmd("-moveentaim","stopmoving")
    register_clcmd("-copyent","stopmoving")
    register_clcmd("-copyentaim","stopmoving")
    
    register_clcmd("amx_ent_move","startmoving",ADMIN_LEVEL_G," [classname/ent] - For moving mutliple ents or moving by number")
    register_clcmd("amx_ent_moveaim","startmoving",ADMIN_LEVEL_G," [classname/ent] - For moving mutliple ents or moving by number by aiming")
    register_clcmd("amx_ent_copy","startmoving",ADMIN_LEVEL_G," [classname/ent] - For copying mutliple ents or copying by number")
    register_clcmd("amx_ent_copyaim","startmoving",ADMIN_LEVEL_G," [classname/ent] - For copying mutliple ents or copying by number by aiming")
    register_clcmd("amx_ent_stop","stopmoving",ADMIN_LEVEL_G," - Stop moving all ents")
    
    register_concmd("amx_ent_remove","removeent",ADMIN_LEVEL_G," [classname/ent] - Deletes an ent")
    register_concmd("amx_ent_rotate","rotate",ADMIN_LEVEL_G," <x> <y> <z> [classname/ent] - Rotates an ent")
    register_concmd("amx_ent_stack","stack",ADMIN_LEVEL_G," <number> <x offset> <y offset> <z offset> [classname/ent]- Make a pile of ents")
    register_concmd("amx_ent_use","forceuse",ADMIN_LEVEL_G," [classname/ent] [player] - Forces an ent to be used with you or a player")
    register_concmd("amx_ent_droptofloor","droptofloor",ADMIN_LEVEL_G," [classname/ent] - Drops an ent to the floor (has to be near floor)")
    register_concmd("amx_ent_originallocation","originallocation",ADMIN_LEVEL_G," [classname/ent] - Returns an ent to its original location")
    register_concmd("amx_ent_render","setrendering",ADMIN_LEVEL_G," <mode> <r> <g> <b> <amt> <fx> [classname/ent] - For rendering an ent (-1 to ignore)")
    
    register_clcmd("amx_ent_weaponmode","weapon",ADMIN_LEVEL_G," - toggles weapon moving mode on yourself")
    
    register_concmd("amx_ent_createplayer","create",ADMIN_LEVEL_G," <name> <classname> - Create an ent on someone")
    register_concmd("amx_ent_createorigin","create",ADMIN_LEVEL_G," <y> <z> <x> <classname> - Create an ent at a location")
    register_concmd("amx_ent_createworld","createworld",ADMIN_LEVEL_G," <speed> <x> <y> <z> - Create a rotating world")
    register_concmd("amx_ent_removeworld","deleteworlds",ADMIN_LEVEL_G," - Removes all rotating worlds")
    
    register_concmd("amx_ent_info","info",ADMIN_LEVEL_G," [classname/ent] - Dump entity keys to your console")
    register_concmd("amx_ent_setkey","setvar",ADMIN_LEVEL_G," [classname/ent] <key> ^"<value>^" - Set entity variable (Use Quotes)")
    
    register_clcmd("amx_ent_load","loadfile",ADMIN_LEVEL_G," <savename> - Loads a saved file")
    register_clcmd("amx_ent_save","savefile",ADMIN_LEVEL_G," <savename> - Saves selected ents in file")
    register_clcmd("amx_ent_saveent","saveent",ADMIN_LEVEL_G," [classname/ent] - Selects an ent to save")
    
    register_clcmd("amx_ent_noclip","noclip",ADMIN_LEVEL_G," - toggles noclip on yourself")
    register_clcmd("amx_ent_godmode","godmode",ADMIN_LEVEL_G," - toggles godmode on yourself")
    register_clcmd("amx_ent_solid","solid",ADMIN_LEVEL_G," - toggles solid mode on yourself")
    register_clcmd("amx_ent_teleport","teleport",ADMIN_LEVEL_G," <x> <y> <z> - teleport yourself to coordinates")
    
    register_forward(FM_UpdateClientData, "UpdateClientData", 1)
}

public pfn_keyvalue(ent){
    new class [1], key [32], value [32], keyvalue [64]
    copy_keyvalue(class,0,key,32,value,32)    
    if (!entvars [ent])
        entvars [ent] = ArrayCreate(64,1)
    format (keyvalue, 64, "%s*%s", key, value)
    ArrayPushString(entvars [ent], keyvalue)
    return PLUGIN_CONTINUE
}

public setKeyValue (ent, key[], value[]){
    new item, keyvalue [64]
    DispatchKeyValue(ent,key,value)
    if (!entvars [ent])
        entvars [ent] = ArrayCreate(64,1)
    format (keyvalue, 64, "%s*%s", key, value)
    if ((item = arrayfindkey (ent, key)) == -1)
        ArrayPushString(entvars [ent], keyvalue)
    else
        ArraySetString(entvars [ent], item, keyvalue)
}

public setKeyValueInt (ent, key[], arg){
    new value [32]
    num_to_str (arg, value, 32)
    setKeyValue (ent, key, value)
}

public setKeyValueFloat (ent, key[], Float:arg){
    new value [32]
    float_to_str (arg, value, 32)
    setKeyValue (ent, key, value)
}

public setKeyValueVector (ent, key[], Float:arg[3]){
    new value [32]
    format (value, 32, "%f %f %f", arg[0], arg[1], arg[2])
    setKeyValue (ent, key, value)
}

public arrayfindkey (ent, tofind []){
    if (!entvars[ent])
        return -1;
    new keyvalue [64], key [32], value [32]
    for (new i=0;i<ArraySize(entvars [ent]);i++){
        ArrayGetString(entvars[ent], i, keyvalue, 64)
        strtok(keyvalue, key, 32, value, 32, '*')
        if (equal(key, tofind))
            return i;
    }
    return -1;
}

public getactualorigin (ent, origin [3]){
    if (ent <= get_maxplayers())
        get_user_origin (ent, origin)
    else{
        new Float:orig [3], Float:mins [3], Float:maxs[3]
        entity_get_vector(ent, EV_VEC_origin, orig)
        entity_get_vector(ent, EV_VEC_mins, mins)
        entity_get_vector(ent, EV_VEC_maxs, maxs)
        for(new i = 0; i < 3; i++)
            origin [i] = floatround((mins[i] + maxs[i]) / 2 + orig [i])
    }
}

public getorigin (ent, origin [3]){
    if (ent <= get_maxplayers())
        get_user_origin (ent, origin)
    else{
        new Float:orig [3]
        entity_get_vector(ent, EV_VEC_origin, orig)
        FVecIVec(orig, origin)
    }
}

public setorigin (ent, origin [3]){
    if (ent <= get_maxplayers())
        set_user_origin (ent, origin)
    else{
        new Float:orig [3]
        IVecFVec(origin, orig)
        entity_set_origin (ent, orig)
    }
}

public getent (id, arg){
    new ent
    if (arg && read_argc() > arg){
        new entarg [64]
        read_argv(arg,entarg,63)
        if (isdigit(entarg [0])){
            ent=str_to_num (entarg)
        }else{
            new ents[1]
            find_sphere_class(id, entarg, 300.0, ents, 1)
            if (!ents[0]){
                console_print (id, "[AMXx] Ent Not Found")
                return 0
              }
            ent=ents[0]
        }
    }
    if (!is_valid_ent(ent)){
        if (!id)
            return 0
        new bodypart
        get_user_aiming (id,ent,bodypart)
        if (!is_valid_ent(ent)) 
            return 0
    }
    return ent
}

public client_PreThink(id) {
    if (weaponmode [id]){
        new buttons = entity_get_int(id, EV_INT_button)
        if (buttons & IN_ATTACK){
            if (weaponmode [id] == 1)
                client_cmd (id, "amx_ent_moveaim")
            weaponmode [id] = 2
            buttons -= IN_ATTACK
        }else if (weaponmode [id] == 2){
            client_cmd (id, "amx_ent_stop")
            weaponmode [id] = 1
        }
        if (buttons & IN_RELOAD){
            if (weaponmode [id] == 1)
                client_cmd (id, "amx_ent_copyaim")
            weaponmode [id] = 3
            buttons -= IN_RELOAD
        }else if (weaponmode [id] == 3){
            client_cmd (id, "amx_ent_stop")
            weaponmode [id] = 1
        }
        if (buttons & IN_ATTACK2){
            if (weaponmode [id] == 1)
                client_cmd (id, "amx_ent_remove")
            buttons -= IN_ATTACK2
            weaponmode [id] = 4
        }else if (weaponmode [id] == 4){
            weaponmode [id] = 1
        }
        entity_set_int(id, EV_INT_button, buttons)
    }
}

public UpdateClientData(id, weapons, cd_handle){
    if (weaponmode [id])
        set_cd(cd_handle, CD_ID, 0)
    return FMRES_HANDLED
}

public weapon (id,level,cid){
    if (!cmd_access(id,level,cid,1))
        return PLUGIN_HANDLED
        
    if (weaponmode [id])
        weaponmode [id] = 0
    else
        weaponmode [id] = 1
        
    console_print (id, "[AMXx] Weapon Mode Toggled")
        
    return PLUGIN_HANDLED
}

public create (id,level,cid){
    new cmd [32]
    read_argv(0,cmd,31)
    if (!cmd_access(id,level,cid,(containi (cmd,"origin")==-1)? 3:5)) 
              return PLUGIN_HANDLED 
              
    new arg [32], classname [32], origin[3], ent, player

    if (containi (cmd,"origin")==-1){
        read_argv(1,arg, 32)
        player=cmd_target(id,arg,7)
        if (!player)
            return PLUGIN_HANDLED
        getorigin (player,origin)
        read_argv(2,classname,32)
    }else{
        for (new i=0;i<3;i++){
            read_argv(i+1,arg,32)
            origin[i]=str_to_num (arg)
        }
        read_argv(4,classname,32)
    }
    if (entity_count()>=MAXENTS-15*get_maxplayers()-100){
        client_print (id, print_chat, "[AMXx] Maximum number of ents reached!")
        return PLUGIN_HANDLED
    }

    ent = create_entity(classname)
    setKeyValue (ent, "classname", classname)
    setKeyValueInt (ent, "spawnflags", 1 << 30)
    setorigin(ent, origin)
    DispatchSpawn(ent)
    
    if (containi(cmd,"origin")==-1)
        fake_touch(player, ent)
    
    console_print (id,"[AMXx] Created Ent Number: %i",ent)
    return PLUGIN_HANDLED 
}

public startmoving (id,level,cid){
    if (!cmd_access(id,level,cid,1)) 
              return PLUGIN_HANDLED 
            
    new ent=getent (id,1)
    if (!ent)
        return PLUGIN_HANDLED
    
    new cmd[32], dontcolour
    read_argv(0,cmd,31)
    if (containi(cmd,"copy")!=-1 && ent > get_maxplayers()){
        if (arrayfindkey (ent, "entmoving_mover") != -1 || arrayfindkey (ent, "entmoving_saver") != -1)
            dontcolour=1
        ent=copyent (ent,id)
    }
        
    if (ent <= get_maxplayers() && get_user_flags(ent)&ADMIN_IMMUNITY){
        client_print (id, print_chat, "[AMXx] You cannot move a user with immunity.")
        return PLUGIN_HANDLED
    }
    
    if (arrayfindkey (ent, "entmoving_mover") != -1 || arrayfindkey (ent, "entmoving_saving") != -1){
        client_print (id, print_chat, "[AMXx] You cannot move an ent that is already being moved or saved.")
        return PLUGIN_HANDLED
    }

    new keyvalue [64]
    format (keyvalue, 64, "%s*%d", "entmoving_mover", id)
    if (!entvars[ent])
        entvars [ent] = ArrayCreate(64,1)
    ArrayPushString(entvars [ent], keyvalue)
    if (!dontcolour)
        colourent (ent, Float:{255.0, 0.0, 0.0})
    
    new information [5], userorigin [3], entorigin [3]
    information[0]=id
    information[1]=ent
    getorigin (id,userorigin)
    
    if (contain (cmd,"aim")==-1){
        getorigin (ent,entorigin)
        for (new i=0;i<3;i++)
            information [i+2]=entorigin[i]-userorigin [i]
        set_task(0.1,"moveoriginal",435+id,information,5,"b")
    }else{
        getactualorigin (ent,entorigin)
        information[2]=get_distance(userorigin, entorigin)
        set_task (0.1,"moveaim",435+id,information,3,"b")
    }
    return PLUGIN_HANDLED
}

public copyent (ent,id){
    if (entity_count()>=MAXENTS-15*get_maxplayers()-100){
        client_print (id, print_chat, "[AMXx] Maximum number of ents reached!")
        return PLUGIN_HANDLED
    }
    new newent, keyvalue [64], key [32], value [32]
    
    entity_get_string(ent, EV_SZ_classname, value, 32)
    newent = create_entity(value)
    if (!newent)
        return PLUGIN_HANDLED
    
    for (new i=0;i<ArraySize(entvars [ent]);i++){
        ArrayGetString(entvars[ent], i, keyvalue, 64)
        strtok(keyvalue, key, 32, value, 32, '*')
        if (!equal (key, "entmoving_mover") && !equal (key, "entmoving_saver")) 
            setKeyValue(newent,key,value)
    }
    DispatchSpawn(newent)
    
    new origin [3]
    getorigin(ent, origin)
    setorigin(newent, origin)
    
    client_cmd(id, "amx_ent_stop");
    return newent
}

public moveoriginal (information[5]){
    new origin[3]
    
    if (!is_user_connected(information[0]) || ((information[1] <= get_maxplayers())? !is_user_connected(information[1]):!is_valid_ent(information[1]))){
        stopmoving (information[0])
        return PLUGIN_HANDLED
    }
    
    getorigin(information[0], origin)
    for (new i=0;i<3;i++)
        origin[i]+=information[i+2]
    setorigin(information[1], origin)
    
    return PLUGIN_CONTINUE
}

public moveaim (information [3]){
    new Float:aiming [3], origin[3]
    
    if (!is_user_connected(information[0]) || ((information[1] <= get_maxplayers())? !is_user_connected(information[1]):!is_valid_ent(information[1]))){
        stopmoving (information[0])
        return PLUGIN_HANDLED
    }
    
    get_user_origin(information[0], origin, 3)
    IVecFVec(origin, aiming)
    getorigin (information[0], origin)
    
    for (new i=0;i<3;i++)
        aiming [i] -= float(origin [i])
    for (new i=0;i<3;i++)
        origin [i] += floatround (aiming [i] * (float(information [2])/vector_length(aiming)))
    
    if (information[1]>get_maxplayers()){
        new Float:mins [3], Float:maxs[3]
        entity_get_vector(information[1], EV_VEC_mins, mins)
        entity_get_vector(information[1], EV_VEC_maxs, maxs)
        for(new i = 0; i < 3; i++)
            origin [i] -= floatround ((mins[i] + maxs[i]) / 2)
    }
    setorigin (information[1],origin)
    
    return PLUGIN_CONTINUE
}

public stopmoving (id){
    if (task_exists (435+id))
        remove_task (435+id)
        
    new item, keyvalue [64], key [32], value [32]
    for (new i=0;i<MAXENTS;i++){
        if ((item = arrayfindkey (i, "entmoving_mover")) != -1){
            ArrayGetString(entvars[i], item, keyvalue, 64)
            strtok(keyvalue, key, 32, value, 32, '*')
            if (equal(key, "entmoving_mover") && id == str_to_num(value)) {
                colourent (i, Float:{0.0, 0.0, 0.0})
                ArrayDeleteItem(entvars [i], item)
            }
        }
    }
    return PLUGIN_HANDLED 
}

public colourentcopykey (ent, tocopy [32]){
    new item, keyvalue [64], key [32], value [32]
    if ((item = arrayfindkey (ent, tocopy)) != -1){
        ArrayGetString(entvars[ent], item, keyvalue, 64)
        strtok(keyvalue, key, 32, value, 32, '*')
        format (keyvalue, 64, "entmoving_%s*%s", tocopy, value)
        ArrayPushString(entvars [ent], keyvalue)
    }else{
        if (equal (tocopy, "renderamt"))
            format (keyvalue, 64, "entmoving_%s*255", tocopy)
        else if (equal (tocopy, "rendercolor"))
            format (keyvalue, 64, "entmoving_%s*0 0 0", tocopy)
        else
            format (keyvalue, 64, "entmoving_%s*0", tocopy)
        ArrayPushString(entvars [ent], keyvalue)
    }
}

public colourentreverse (ent, reverse [32]){
    new item, keyvalue [64], key [32], value [32]
    format (key, 32, "entmoving_%s", reverse)
    if ((item = arrayfindkey (ent, key)) != -1){
        ArrayGetString(entvars[ent], item, keyvalue, 64)
        strtok(keyvalue, key, 32, value, 32, '*')
        setKeyValue(ent, reverse, value)
        ArrayDeleteItem(entvars [ent], item)
    }
}

public colourent (ent, Float:colours [3]){
    if (colours [0] == 0.0 && colours [1] == 0.0 && colours [2] == 0.0){
        colourentreverse (ent, "rendermode")
        colourentreverse (ent, "renderamt")
        colourentreverse (ent, "rendercolor")
    }else{
        colourentcopykey (ent, "rendermode")
        colourentcopykey (ent, "renderamt")
        colourentcopykey (ent, "rendercolor")
        setKeyValue(ent, "rendermode", "1")
        setKeyValue(ent, "renderamt", "100")
        setKeyValueVector(ent, "rendercolor", colours)
    }
}

public stack(id,level,cid){ 
    if (!cmd_access(id,level,cid,5)) 
        return PLUGIN_HANDLED 

    new arg[64], ent=getent (id,5)
    if (!ent || ent <= get_maxplayers())
        return PLUGIN_HANDLED 

    read_argv(1,arg,63) 
    new amount = str_to_num(arg)

    new entorigin [3]
    getorigin(ent, entorigin)
    for(new i=0;i<amount;i++){ 
        ent=copyent (ent,id)
        for (new j=0;j<3;j++){
            read_argv(j+2,arg,63) 
            entorigin[j] += str_to_num(arg) 
        }
        setorigin(ent, entorigin)
    }
    return PLUGIN_HANDLED
} 


public rotate (id,level,cid){
    if (!cmd_access(id,level,cid,4)) 
        return PLUGIN_HANDLED 

    new arg [32], Float:angles [3], entorigin [3], ent = getent (id, 4)
    if (!ent)
        return PLUGIN_HANDLED
    
    entity_get_vector(ent, EV_VEC_angles, angles)
    for (new i=0;i<3;i++){
        read_argv(i+1,arg,31)
        angles [i] += floatstr (arg)
    }
    
    getorigin(ent, entorigin)
    entity_set_vector(ent, EV_VEC_v_angle, angles)
    entity_set_vector(ent, EV_VEC_angles, angles)
    setorigin(ent, entorigin)
    
    return PLUGIN_HANDLED 
}

public originallocation (id,level,cid){
    if (!cmd_access(id,level,cid,1)) 
              return PLUGIN_HANDLED 
          
    new ent = getent (id, 1)
    if (!ent || ent <= get_maxplayers())
        return PLUGIN_HANDLED

    new dimensions [3] = {0, 0, 0}
    setorigin(ent, dimensions)
    
    return PLUGIN_HANDLED
}

public forceuse (id,level,cid){
    if (!cmd_access(id,level,cid,1)) 
              return PLUGIN_HANDLED 

    new ent = getent (id, 1)
    if (!ent)
        return PLUGIN_HANDLED
    
    if (read_argc()>2){
        new arg [32], player
        read_argv(2,arg,31)
        player=cmd_target(id,arg,3)
        if (player)
            force_use(player,ent)
    }else{
        force_use(id,ent)
    }
    
    return PLUGIN_HANDLED
}

public removeent (id,level,cid){
    if (!cmd_access(id,level,cid,1)) 
        return PLUGIN_HANDLED 
          
    new ent = getent (id, 1)
    if (!ent || ent <= get_maxplayers())
        return PLUGIN_HANDLED
    
    if (entvars [ent])
        ArrayDestroy (entvars [ent])
    remove_entity(ent)
        
    return PLUGIN_HANDLED
}

public droptofloor (id,level,cid){
    if (!cmd_access(id,level,cid,1)) 
              return PLUGIN_HANDLED 
          
    new ent = getent (id, 1)
    if (!ent || ent <= get_maxplayers())
        return PLUGIN_HANDLED
    
    drop_to_floor(ent)
    
    return PLUGIN_HANDLED
}

public setrendering (id,level,cid){
    if (!cmd_access(id,level,cid,7)) 
        return PLUGIN_HANDLED 
        
    new ent = getent (id,7)
    if(!ent) 
        return PLUGIN_HANDLED
              
    new arg[32], mode, Float:colours [3], Float:amt, fx
    read_argv(1,arg,32)
    mode = str_to_num(arg)

    for (new i=0;i<3;i++){
        read_argv(i+2,arg,32)
        colours[i] = floatstr(arg)
    }

    read_argv(5,arg,32)
    amt = floatstr(arg)

    read_argv(6,arg,31)
    fx = str_to_num(arg)
    
    if (mode != -1)    
        setKeyValueInt(ent, "rendermode", mode)
    if (colours [0] != -1 && colours [1] != -1 && colours [2] != -1)
        setKeyValueVector(ent, "rendercolor", colours)
    if (amt != -1) 
        setKeyValueFloat(ent, "renderamt", amt)
    if (fx != -1) 
        setKeyValueInt(ent, "renderfx", fx)

    return PLUGIN_HANDLED
}

public createworld (id,level,cid){
    if (!cmd_access(id,level,cid,4)) 
              return PLUGIN_HANDLED 
          
    new rotatingworld = create_entity("func_rotating")
          
    new arg [64]
    get_mapname(arg,64)
    format (arg, 64, "maps/%s.bsp",arg)
    setKeyValue (rotatingworld, "model", arg)
    read_argv(1,arg,64)
    setKeyValue (rotatingworld, "speed", arg)
    read_args(arg,64)
    copy(arg,64,arg [contain (arg, " ")])
    setKeyValue (rotatingworld, "angles", arg)
          
    setKeyValue (rotatingworld, "spawnflags", "65")
          
    DispatchSpawn(rotatingworld)
          
    return PLUGIN_HANDLED 
}

public deleteworlds (id,level,cid){
    if (!cmd_access(id,level,cid,1)) 
              return PLUGIN_HANDLED 

    new ent = -1, model [64]
    get_mapname(model,64)
    format (model, 64, "maps/%s.bsp",model)
    while ((ent = find_ent_by_model(-1, "func_rotating", model)))
        remove_entity(ent)
          
          return PLUGIN_HANDLED 
}

public saveent (id,level,cid){
    if (!cmd_access(id,level,cid,1)) 
        return PLUGIN_HANDLED 
          
    new ent=getent (id,1)
    if (!ent || ent <= get_maxplayers())
        return PLUGIN_HANDLED    
    
    if (arrayfindkey (ent, "entmoving_mover") != -1 || arrayfindkey (ent, "entmoving_saver") != -1){
        client_print (id, print_chat, "[AMXx] You cannot save an ent that is already being moved or saved.")
        return PLUGIN_HANDLED
    }

    new keyvalue [64]
    format (keyvalue, 64, "%s*%d", "entmoving_saver", id)
    if (!entvars[ent])
        entvars [ent] = ArrayCreate(64,1)
    ArrayPushString(entvars [ent], keyvalue)
    colourent (ent, Float:{0.0, 255.0, 0.0})
    
    return PLUGIN_HANDLED
}

public loadfile (id,level,cid){
    if (!cmd_access(id,level,cid,2)) 
        return PLUGIN_HANDLED 
        
    new arg [32], file [128]
    read_argv(1,arg,32)
    get_mapname(file, 32)
    format(file,128,"%s/%s-%s.txt", SAVEPATH, file, arg)
    if (!file_exists(file)){
        console_print (id, "[AMXx] That savename does not exist.")
        return PLUGIN_HANDLED 
    }
    
    new txtlen, text [64], line
    while ((line=read_file(file,line,text,64,txtlen)))
        if (equal (text, "-----"))
            loadents (file, line, id)
    
    return PLUGIN_HANDLED 
}

public savefile (id,level,cid){
    if (!cmd_access(id,level,cid,2)) 
          return PLUGIN_HANDLED 
        
    if (!dir_exists(SAVEPATH))
        mkdir(SAVEPATH)
        
    new arg [32], file [128]
    read_argv(1,arg,32)
    get_mapname(file, 32)
    format(file,128,"%s/%s-%s.txt", SAVEPATH, file, arg)
    if (file_exists(file)){
        console_print (id, "[AMXx] That savename already exists.")
        return PLUGIN_HANDLED 
    }
    
    new item, keyvalue [64], key [32], value [32]
    for (new i=0;i<MAXENTS;i++){
        if ((item = arrayfindkey (i, "entmoving_saver")) != -1){
            ArrayGetString(entvars[i], item, keyvalue, 64)
            strtok(keyvalue, key, 32, value, 32, '*')
            if (equal(key, "entmoving_saver") && id == str_to_num(value)) {
                colourent (i, Float:{0.0, 0.0, 0.0})
                ArrayDeleteItem(entvars [i], item)
                saveents (i, file)
            }
        }
    }
    
    return PLUGIN_HANDLED 
}

public saveents (ent, file [128]){
    write_file(file,"-----")
    new keyvalue [64]
    entity_get_string(ent, EV_SZ_classname, keyvalue, 64)
    format (keyvalue, 64, "classname*%s", keyvalue)
    for (new i=0;i<ArraySize(entvars [ent]);i++){
        ArrayGetString(entvars[ent], i, keyvalue, 64)
        write_file(file,keyvalue)
    }
    new origin [3]
    getorigin(ent, origin)
    format(keyvalue, 64, "origin*%d %d %d", origin [0], origin [1], origin [2])
    write_file(file,keyvalue)
}

public loadents (file [128],line, id){
    new keyvalue [64], txtlen, ent, key [32], value [32]
    while ((line=read_file(file,line,keyvalue,64,txtlen))){
        if (equal (keyvalue, "-----"))
            break
        if (entity_count()>=MAXENTS-15*get_maxplayers()-100){
            client_print (id, print_chat, "[AMXx] Maximum number of ents reached!")
            return PLUGIN_HANDLED
        } 
        strtok(keyvalue, key, 32, value, 32, '*')
        console_print (id, "key: %s, value:%s",key,value)
        if (equal (key, "classname")){
            ent = create_entity(value)
            if (!ent)
                return PLUGIN_HANDLED
            console_print (id, "classname")
        }
        setKeyValue(ent,key,value)
    }
    DispatchSpawn(ent)
    line--
    return PLUGIN_CONTINUE
}

public client_disconnect (id){
    new item, keyvalue [64], key [32], value [32]
    for (new i=0;i<MAXENTS;i++){
        if ((item = arrayfindkey (i, "entmoving_saver")) != -1){
            ArrayGetString(entvars[i], item, keyvalue, 64)
            strtok(keyvalue, key, 32, value, 32, '*')
            if (equal(key, "entmoving_saver") && id == str_to_num(value)) {
                colourent (i, Float:{0.0, 0.0, 0.0})
                ArrayDeleteItem(entvars [i], item)
            }
        }
    }
}

public info (id,level,cid){
    if (!cmd_access(id,level,cid,1)) 
        return PLUGIN_HANDLED 

    new ent = getent (id, 1)
    if (!ent || ent <= get_maxplayers())
        return PLUGIN_HANDLED

    new key [32], value [32], keyvalue [64]

    console_print (id, "*** Entity Keys for Ent #%i ***",ent)
    
    for (new i=0;i<ArraySize(entvars [ent]);i++){
        ArrayGetString(entvars[ent], i, keyvalue, 64)
        strtok(keyvalue, key, 32, value, 32, '*')
        if (!equal (key, "entmoving_", 10)) 
            console_print (id, "%s: ^"%s^"",key,value)
    }
        
    new origin [3]
    getactualorigin (ent, origin)
    console_print (id, "origin: ^"%d %d %d^"",origin[0],origin[1],origin[2])
    
    return PLUGIN_HANDLED 
}

public setvar (id,level,cid){
    if (!cmd_access(id,level,cid,3)) 
        return PLUGIN_HANDLED 
          
    new ent, arg [32], key [32], argsadd
    if (read_argc() == 4){
        ent = getent (id, 1)
        argsadd++
    }else
        ent = getent (id, 0)
    
    if (!ent)
        return PLUGIN_HANDLED
        
    read_argv(1+argsadd,key,31)
    read_argv(2+argsadd,arg,31)
    setKeyValue (ent,key,arg)
    
    console_print (id, "[AMXx] Key Set")
          
    return PLUGIN_HANDLED
}

public noclip (id,level,cid){
    if (!cmd_access(id,level,cid,1))
        return PLUGIN_HANDLED
        
    if (get_user_noclip(id))
        set_user_noclip(id)
    else
        set_user_noclip(id, 1)
    
    new name[32], authid[32]
    get_user_name(id,name,31)
    get_user_authid(id, authid, 31)
    log_amx("[Noclip] ^"%s<%s>^" has toggled noclip",name,authid)
    console_print(id,"[AMXx] Noclip Toggled")
    
    return PLUGIN_HANDLED
}

public godmode (id,level,cid){
    if (!cmd_access(id,level,cid,1))
        return PLUGIN_HANDLED
        
    if (get_user_godmode(id))
        set_user_godmode(id)
    else
        set_user_godmode(id, 1)
    
    new name[32], authid[32]
    get_user_name(id,name,31)
    get_user_authid(id, authid, 31)
    log_amx("[Godmode] ^"%s<%s>^" has toggled godmode",name,authid)
    console_print(id,"[AMXx] Godmode Toggled")
    
    return PLUGIN_HANDLED
}

public solid (id,level,cid){
    if (!cmd_access(id,level,cid,1))
        return PLUGIN_HANDLED
    
    if (!entity_get_int(id, EV_INT_solid))
        setKeyValue(id,"solid","3")
    else
        setKeyValue(id,"solid","0")
        
    new name[32], authid[32]
    get_user_name(id,name,31)
    get_user_authid(id, authid, 31)
    log_amx("[Solid] ^"%s<%s>^" has toggled solid",name,authid)
    console_print(id,"[AMXx] Solid Toggled")
    
    return PLUGIN_HANDLED
}

public teleport (id,level,cid){
    if (!cmd_access(id,level,cid,4))
        return PLUGIN_HANDLED
    
    new arg [32], coordinates [3]
    for (new i=0;i<3;i++){
        read_argv(i+1,arg,32)
        coordinates [i] = str_to_num (arg)
    }
    set_user_origin (id, coordinates)
    
    new name[32], authid[32]
    get_user_name(id,name,31)
    get_user_authid(id, authid, 31)
    log_amx("[Teleport] ^"%s<%s>^" has teleport to ^"%i %i %i^"",name,authid,coordinates [0], coordinates [1], coordinates [2])
    console_print(id,"[AMXx] Teleported")
    
    return PLUGIN_HANDLED
} 

Video of Plugin Performance

https://www.aparat.com/v/YKIix

Użytkownik milad512 edytował ten post 01.04.2020 17:14

  • +
  • -
  • 0

#2 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 01.04.2020 17:19

Automatyczna wiadomość


Ten temat został przeniesiony z forum

AMX Mod X > Szukam pluginu

do

AMX Mod X > Multilingual
  • +
  • -
  • 0





Również z jednym lub większą ilością słów kluczowych: basebuilder,

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych