[CSGO] Tools

Тема в разделе "Тестовые плагины", создана пользователем inklesspen, 2 май 2016.

  1. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    835
    Симпатии:
    197
    CSGO Tools V1.3

    Данный плагин позволит лучше пощупать возможности сущностей SourceEngine, AcceptEntityInput а так-же просто пофаниться (Я себе повесил арбузы на ноги, руки и голову, проехался на машине влево, заспавнил раунд посреди раунда, выдал себе ночное зрение, отправил друга в космос(Я просто прыгнул) и кикнул бота командой "kill", ).

    Поддерживаемые игры:
    - Тестировал только на CSGO, про остальные игры не знаю

    sm_getmenu - Открывает меню, позволяющее получать данные о сущностях.
    sm_setentitymodel {entityid} {modelname} - SetEntityModel(entityid, modelname) + PrecacheModel
    sm_setentitymovetype {entityid} {MoveVype:id} - SetEntityMoveType(entityid, MoveType:id)
    sm_setentityrendermode {entityid} {RenderMode:id} - SetEntityRenderMode(entityid, RenderMode:id)
    sm_setentityrendercolor {entityid} {RED} {GREEN} {BLUE} {ALPHA} | Если arg = -1, значение не меняется
    sm_precachemodel {String:modelpath} - PrecacheModel(modelpath)
    sm_precachesound {path_to_sound} - Прекеширует звук(например "*/ic/zr_commander/attack.mp3")
    sm_ent_create {entity_name} - Создает сущность (например "prop_physics"), в чат выводится ID
    sm_ent_accept_input {entityid} {String:command} {activator} {caller} {outputid} [String:arg], ...
    sm_ent_key_value {entityid} {String:key} {String:value} - DispatchKeyValue(entityid, key, value)
    sm_ent_key_float {entityid} {String:key} {Float:value} - DispatchKeyFloat(entityid, key, value)
    sm_ent_key_vector {entityid} {String:key} {Float:pos1} {Float:pos2} {Float:pos3} - DispatchKeyValue(entityid, key, Float:{pos1, pos2, pos3})
    sm_ent_spawn {entityid} - DispatchSpawn(entityid)
    sm_ent_teleport_to_me {entityid} - Телепортирует entityid к вам
    sm_ent_teleport_to_aim {entityid} - Телепортирует entityid в точку, на которую смотрите
    sm_ent_setprop_int {entityid} {String:fieldname} {value} - SetEntProp
    sm_ent_setprop_float {entityid} {String:fieldname} {Float:value} - SetEntPropFloat
    sm_ent_setprop_vector {entityid} {String:fieldname} {Float:pos1} {Float:pos2} {Float:pos3}- SetEntPropVector
    sm_ent_setprop_string {entityid} {String:fieldname} {String:value} - SetEntPropString

    Эта команда вызывает функцию AcceptEntityInput таким образом:
    AcceptEntityInput(entityid, command, activator, caller, outputid)

    А теперь подробнее о [String:arg].
    Их можно вводить сколько угодно, и значение это имеет несколько типов.
    В общем это функция SetVariantString, SetVariantFloat и т.д.
    Чтобы вводилось значение как String, надо перед текстом поставить ic_string: , чтобы получилось такая ересь: ic_string:command
    Как нацепить на голову игроку проп?
    sm_ent_accept_input propid "SetParent" client propid 0 "ic_string:!activator"
    sm_ent_accept_input propid "SetParentAttachment" client propid 0 "ic_string:facemask"
    Код:
    SetVariantString("!activator");
    AcceptEntityInput(propid, "SetParent", client, propid, 0);
    SetVariantString("facemask");
    AcceptEntityInput(propid, "SetParentAttachment", client, propid, 0);
    
    ic_string - текст
    ic_int - Целое число
    ic_float - Дробное число
    ic_entity - Тоже целое число, но функция SetVarriantEntity и используется entityid

    MOVETYPE_NONE = 0,
    MOVETYPE_ISOMETRIC = 1,
    MOVETYPE_WALK = 2,
    MOVETYPE_STEP = 3,
    MOVETYPE_FLY = 4,
    MOVETYPE_FLYGRAVITY = 5,
    MOVETYPE_VPHYSICS = 6,
    MOVETYPE_PUSH = 7,
    MOVETYPE_NOCLIP = 8,
    MOVETYPE_LADDER = 9,
    MOVETYPE_OBSERVER = 10,
    MOVETYPE_CUSTOM = 11,
    RENDER_NORMAL = 0
    RENDER_TRANSCOLOR = 1
    RENDER_TRANSTEXTURE = 2
    RENDER_GLOW = 3
    RENDER_TRANSALPHA = 4
    RENDER_TRANSADD = 5
    RENDER_ENVIRONMENTAL = 6
    RENDER_TRANSADDFRAMEBLEND = 7
    RENDER_TRANSALPHAADD = 8
    RENDER_WORLDGLOW = 9
    RENDER_NONE = 10

    Примеры команд
    sm_ent_create prop_physics | (Запоминаем число в чате как entityid)
    sm_ent_key_value entityid "model" "models/props_junk/watermelon01.mdl"
    sm_ent_spawn entityid
    sm_ent_key_value entityid "solid" "0"
    sm_ent_accept_input entityid "SetParent" @me entityid 0 "ic_string:!activator"
    sm_ent_accept_input entityid "SetParentAttachment" @me entityid 0 "ic_string:facemask"
    new entityid = CreateEntityByName("prop_physics")
    DispatchKeyValue(entityid, "model", "models/props_junk/watermelon01.mdl")

    DispatchSpawn(entityid)
    DispatchKeyValue(entityid, "solid", "0")
    SetVarriantString("!activator")
    AcceptEntityInput(entityid, "SetParent", client, entityid, 0);

    SetVariantString("facemask");
    AcceptEntityInput(entityid, "SetParentAttachment", client, entityid, 0);
    sm_ent_create light_dynamic | (Запоминаем число в чате как entityid)
    sm_ent_key_value entityid "_light" "255 70 70 255"
    sm_ent_key_float entityid "distance" "500.0"
    sm_ent_spawn entityid
    sm_ent_teleport_to_me entityid
    sm_ent_accept_input entityid "SetParent" @me entityid "ic_string:!activator"
    new entityid = CreateEntityByName("light_dynamic")
    DispatchKeyValue(entityid, "_light", "255 70 70 255")

    DispatchKeyFloat(entityid, "distance", 500.0)

    DispatchSpawn(entityid)
    new Float:pos[3]
    GetClientAbsPosition(client, pos)
    TeleportEntity(entityid, pos, NULL_VECTOR, NULL_VECTOR)

    SetVarriantString("!activator")
    AcceptEntityInput(entityid, "SetParent", client, entityid, 0);

    Кваров, нативов и форвардов нету, но никто не мешает вам их добавить:)

    Отдельная благодарность:
    KrolZ - За толчок в мир SourcePawn
    inklesspen (Да, мне ) - За идею

    Идеи пишите в ЛС, если есть время и желание, сделаю.
    И еще, прошу IP серверов с этим плагином мне писать в ЛС. Хочу знать сколько таких серверов :)
     

    Вложения:

    • ic_tools.smx
      Размер файла:
      16,7 КБ
      Просмотров:
      3
    • ic_tools.sp
      Размер файла:
      20,8 КБ
      Просмотров:
      4
    Последнее редактирование: 3 май 2016
    666FoX666, TheEvilGhost и AS TRO нравится это.
  2. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.991
    Симпатии:
    2.988
    @inklesspen,
    PHP:
    decl String:arg[4][256]
        
    GetCmdArg(1arg[0], 256)
        
    GetCmdArg(2arg[1], 256)
        
    GetCmdArg(3arg[2], 256)
        
    GetCmdArg(4arg[3], 256)
        new 
    entity CheckString(clientarg[0])
        if(!
    YesEntityYes(entity))
        {
            
    CGOPrintToChat(client"[{LIGHTGREEN}InkCore{DEFAULT}] Invalid entity"entity)
            return;
        }
        new 
    Float:pos[3]
        
    pos[0] = StringToFloat(arg[1])
        
    pos[1] = StringToFloat(arg[2])
        
    pos[2] = StringToFloat(arg[3])
    Зачем создать столько строк если можно обойтись одной?
    Так же нет проверки на количество аргументов.
    Ну те же ошибки во всех командах.

    без ; писать не тру. Если будешь лепить в 1 строку - компилятор не поймет.

    PHP:
    public bool YesEntityYes(entity)
    {
        if(!
    YesPlayer(entity)&&!YesEntityMe)
            return 
    false
        
    return true
    }
    Проще же
    PHP:
    bool YesEntityYes(entity)
    {
        return (
    YesPlayer(entity)&&YesEntityMe);
    }
    public не нужен во внутренних функциях плагина, только на тех, которые вызываются извне.
    stock тоже не нужен. Он используется в inc файлах, для того чтобы функции помеченные stock но, которые не используются не включались компилятором в плагин.

    PHP:
    for(new i=6;i<=args;i++)
            {
                
    decl String:ink[256]
                
    GetCmdArg(iinksizeof(ink))
                if(
    ReplaceString(ink256"ic_string:""")!=0)
    Переменную создавай до цикла.

    И вообще это
    PHP:
        if(args>5)
        {
            
    // ...
        
    }
        if(
    args==2)
        {
            
    AcceptEntityInput(entityarg)
        }
        else if(
    args==3)
        {
            
    GetCmdArg(3arg256)
            new 
    param1 CheckString(clientarg)
            
    GetCmdArg(2arg256)
            
    AcceptEntityInput(entityargparam1)
        }
        else if(
    args==4)
        {
           
    // ...
        
    }
        else if(
    args>=5)
        {
           
    // ...
        
    }
    Лучше сделать так:
    PHP:
    switch(args)
    {
        case 
    2:
        {
            
    AcceptEntityInput(entityarg)
        }
        case 
    3:
        {
            
    GetCmdArg(3arg256)
            new 
    param1 CheckString(clientarg)
            
    GetCmdArg(2arg256)
            
    AcceptEntityInput(entityargparam1)
        }
        case 
    4:
        {
            
    GetCmdArg(3arg256)
            new 
    param1 CheckString(clientarg)
            
    GetCmdArg(4arg256)
            new 
    param2 CheckString(clientarg)
            
    GetCmdArg(2arg256)
            
    AcceptEntityInput(entityargparam1param2)
        }
        default:
        {
            if(
    args>5)
            {
                
    decl String:ink[256]
                    for(new 
    i=6;i<=args;i++)
                {
                    
    GetCmdArg(iinksizeof(ink))
                    if(
    ReplaceString(ink256"ic_string:""")!=0)
                    {
                        
    PrintToConsole(client"Пойман: Строка")
                        
    SetVariantString(ink)
                    }
                    else if(
    ReplaceString(ink256"ic_int:""")!=0)
                    {
                        
    SetVariantInt(StringToInt(ink))
                    }
                    else if(
    ReplaceString(ink256"ic_bool:""")!=0)
                    {
                        
    SetVariantBool(bool:StringToInt(ink))
                    }
                    else if(
    ReplaceString(ink256"ic_float:""")!=0)
                    {
                        
    SetVariantFloat(StringToFloat(ink))
                    }
                    else if(
    ReplaceString(ink256"ic_entity:""")!=0)
                    {
                        
    SetVariantEntity(StringToInt(ink))
                    }
                }
            }
            if(
    args>=5)
            {
                
    GetCmdArg(3arg256)
                new 
    param1 CheckString(clientarg)
                
    GetCmdArg(4arg256)
                new 
    param2 CheckString(clientarg)
                
    GetCmdArg(5arg256)
                new 
    param3 CheckString(clientarg)
                
    GetCmdArg(2arg256)
                
    AcceptEntityInput(entityargparam1param2param3)
            }
        }
    }

    PHP:

    int GetClientOnAim
    (clientbool:originalaimtarget=false)
    {
        if(
    originalaimtarget)
            return 
    GetClientAimTarget(clientfalse)
        
    decl Float:origin[3], Float:angles[3];
        
    GetClientEyePosition(clientorigin); GetClientEyeAngles(clientangles);
        
    TR_TraceRayFilter(originanglesMASK_SOLIDRayType_InfiniteFilterclient);
        if (!
    TR_DidHit())
            return -
    1;
        new 
    ent TR_GetEntityIndex();
        
    TR_GetEndPosition(origin);
        if (
    ent && ent <= MaxClients) return ent;
        else return -
    1;
    }
    Ты будешь удивлено но GetClientAimTarget это и есть
    [/php]decl Float:origin[3], Float:angles[3];
    GetClientEyePosition(client, origin); GetClientEyeAngles(client, angles);
    TR_TraceRayFilter(origin, angles, MASK_SOLID, RayType_Infinite, Filter, client);
    if (!TR_DidHit())
    return -1;
    new ent = TR_GetEntityIndex();
    TR_GetEndPosition(origin);
    if (ent > 0 && ent <= MaxClients) return ent;
    else return -1;
    [/php]

    PHP:
    if(StrEqual(arg"getmenu_getpropid"))
            {
                
    CGOPrintToChat(client"[{LIGHTGREEN}InkCore{DEFAULT}] Entity index: %i"lol[0])
            }
            else if(
    StrEqual(arg"getmenu_getpropclassname"))
            {
                
    GetEntityClassname(lol[0], argsizeof(arg))
                
    CGOPrintToChat(client"%s %s"PREFIXarg)
            }
            else if(
    StrEqual(arg"getmenu_getplayerhealth"))
            {
                
    CGOPrintToChat(client"%s %i"PREFIXGetClientHealth(lol[0]))
            }
            else if(
    StrEqual(arg"getmenu_getplayeruserid"))
            {
                
    CGOPrintToChat(client"%s %i"PREFIXGetClientUserId(lol[0]))
            }
            else if(
    StrEqual(arg"getmenu_getmyuserid"))
            {
                
    CGOPrintToChat(client"%s %i"PREFIXGetClientUserId(client))
            }
            else if(
    StrEqual(arg"getmenu_getmyid"))
            {
                
    CGOPrintToChat(client"%s %i"PREFIXclientGetClientUserId(client))
            }
            else if(
    StrEqual(arg"getmenu_select_player"))
            {
                
    GetPlayerMenu(client)
            }
            else if(
    StrEqual(arg"getmenu_getproppos"))
            {
                new 
    Float:pos[3]
                
    GetEntPropVector(lol[0], Prop_Send"m_vecOrigin"pos)
                
    CGOPrintToChat(client"%s Position: %f %f %f"PREFIXpos[0], pos[1], pos[2])
            }
            else if(
    StrEqual(arg"getmenu_select_prop"))
            {
                
    GetPropMenu(client)
            }
    а почему бы сюда не передавать цифру, а по ней уже switch, так же проще чем со строками.
     
  3. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    835
    Симпатии:
    197
    Я лепил на скорую руку. Мне еще нужно было поработать над плагином ZR Commander от Franc1sco, у него руки не доходят.
    switch это хорошо, но мне удобнее if, всегда можно взять код и исправить его.

    У меня эта функция не работала, вот я и решил использовать сразу GetClientAimTarget.

    Я не знал про это. Эти слова запомню + еще пошарю на wiki.

    Совсем забыл про проверку... Спасибо
    --- Добавлено позже ---
    У меня с цифрами в таком плане проблемы. Опять-же, всегда можно взять код и исправить его.
    За замечания и помощь спасибо. Обязательно займусь этим
    --- Добавлено позже ---
    Дело в том, что переменная "ink" - строка. Так-что я пожалую такое делать не буду.
     
    Последнее редактирование: 2 май 2016
  4. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.991
    Симпатии:
    2.988
    А чем switch нельзя изменить?
    И что что строка?
     
  5. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    835
    Симпатии:
    197
    А, я думал ты говоришь присвоить строке размер, равному кол-ва аргументов, была б строка с размером 6 :D

    Что и куда изменить? Я немного не понял.
     
  6. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Как спавнится машина? Цепляется моделька? или имитация вождения как в гонках.
     
  7. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    835
    Симпатии:
    197
    sm_ent_create prop_physics_multiplayer | (запоминаем ID как entityid)
    sm_ent_key_value entityid "model" "models/props_vehicles/taxi_city.mdl"
    sm_ent_spawn entityid
    sm_ent_teleport_to_me entityid

    Потом залелаем с noclip на 1 седенье, и пишет следующее:
    sm_ent_accept_input entityid "SetParent" @me entityid "ic_string:!activator"

    Вырубаем NoClip, и едем влево :)
    В общем цепляется моделька, но при этом проп толкает игрока, а не на оборот
     
  8. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @inklesspen, так в csgo есть такая функция prop_vehicle и prop_vehicle_driveable. Но пока у меня с ними ни чего, не вышло, лишь только сесть в машину и все..
     
  9. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    835
    Симпатии:
    197
    Не знал. Вообще суть плагина не только в том, чтобы ездить на машинах...
    А за инфу - спасибо.
    --- Добавлено позже ---
    Можно декомпилировать мапу на прохождение для CS:GO (какой-то coop_ карта). Там полюбому будет инфа о транспорте.
     
  10. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Я понимаю что суть не в этом. Это мне для roleplay нужно, а так я подумал возможно он подобное может реализовать, ну видимо нет.
     
  11. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    835
    Симпатии:
    197
    Я немного посидел в мапе... Знаете Garry's mod? Если да, то знаете ли вы, как действуют трусеры(Ну типо активируешь и они движуться в определенную сторону). Так с этими штуками можно создать полноценную машину
     
  12. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @inklesspen, у меня впринципе есть код который создает машину, на ней можно по ездить туда-сюда, по управлять ей и выйти из нее. Мне просто было интересно посредством этого плагина реализовать, ибо мой код получился на 1к строк.