Получить позицию оружия

Тема в разделе "Программирование / Скриптинг", создана пользователем Колян, 6 окт 2016.

  1. Колян

    Колян

    Сообщения:
    107
    Симпатии:
    3
    new weapon = GivePlayerItem(t, "weapon_c4"); //Даем игроку оружие и запоминаем индекс оружия
    new Float:pos[3];
    GetEntPropVector(weapon, Prop_Send, "m_vecOrigin", pos); //Пытаемся получить координаты оружия по индексу.

    Ошибки в error.log:
    "L 10/06/2016 - 20:58:02: [SM] Native "GetEntPropVector" reported: Entity 344 (344) is invalid
    L 10/06/2016 - 20:58:02: [SM] Displaying call stack trace for plugin "Mod.smx":
    L 10/06/2016 - 20:58:02: [SM] [0] Line 84, C:\Users\\Desktop\pwn\sourcemod\scripting\f.sp::func()"

    84 строка это - GetEntPropVector(weapon, Prop_Send, "m_vecOrigin", pos);
     
  2. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.506
    Симпатии:
    1.961
    Так если выдаёшь предмет игроку с индексом client, то почему бы просто не получать координаты этого самого игрока?
    PHP:
    GetClientAbsOrigin(clientpos);
     
  3. Колян

    Колян

    Сообщения:
    107
    Симпатии:
    3
    Нужно именно этого оружия .... например если он его выкинет то нужно продолжать брать координаты оружия.
     
  4. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.506
    Симпатии:
    1.961
    Если проблема конкретно в ошибке, то, как минимум, требуется проверка:
    PHP:
    if (IsValidEntity(weapon))
     
  5. Колян

    Колян

    Сообщения:
    107
    Симпатии:
    3
    Умолчал важную деталь. Я пользуюсь плагином который позволяет КТ брать бомбу. Когда я беру координату бомбы (c4) Т - все работает отлично, когда бумбу которая у КТ в руках - спамит это ошибку..((( как пофиксить?

    Вот код плагина который позволяет брать бомбу КТ.
    PHP:
    //* This plugins is a remake of an Eventscripts plugin //*
    //* called CTrun (http://addons.eventscripts.com/addons/view/CTRun) //*

    #include <sourcemod>
    #include <sdktools>
    #include <cstrike>
    #include <sdkhooks>

    public Plugin:myinfo =
    {
        
    name "CT-C4",
        
    author "rodipm",
        
    description "Allows Менты to pickup the c4 and plant it.",
        
    version "1.0",
        
    url "sourcemod.net"
    }

    new 
    Handle:g_canplant INVALID_HANDLE;
    new 
    bool:wait;
    new 
    bool:holding[MAXPLAYERS+1];

    public 
    OnPluginStart()
    {
        
    g_canplant CreateConVar("ctc4_canplant""0""Defines if Менты can plant the bomb. Default = 0");
     
        
    HookEvent("bomb_dropped"Dropped);
        
    HookEvent("bomb_pickup"Pickup);
        
    HookEvent("bomb_planted"Planted);
        
    HookEvent("bomb_beginplant"Planting);
        
    HookEvent("round_start"RoundStart);
        
    HookEvent("round_end"RoundEnd);
     
        
    //for(new i = 1; i <= MaxClients; i++)
        //{
        //    if(IsClientInGame(i) && IsClientConnected(i))
        //        OnClientPutInServer(i);
        //}
    }

    public 
    OnClientPutInServer(client)
    {
        
    SDKHook(clientSDKHook_TouchTouch);
    }

    public 
    Touch(ent1ent2)
    {
        if(!
    wait && !holding[ent1])
        {
            if(
    ent1 && ent1 <= MaxClients && IsPlayerAlive(ent1) && GetClientTeam(ent1) == CS_TEAM_CT)
            {
                
    decl String:name[50];
                
    GetEdictClassname(ent2name50);
             
                if(
    StrContains(name"weapon_c4") != -1)
                {
                    
    SetEntProp(ent1Prop_Send"m_iTeamNum"2);
                    
    RemoveEdict(ent2);
                    
    GivePlayerItem(ent1"weapon_c4");
                    
    SetEntProp(ent1Prop_Send"m_iTeamNum"3);
                    
    holding[ent1] = false ;
                }
            }
        }
    }

    public 
    Dropped(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        if(
    IsClientConnected(client) && IsClientInGame(client) && GetClientTeam(client) == CS_TEAM_CT)
        {
            
    wait true;
            
    CreateTimer(0.5WaitCheck);
            
    holding[client] = false;
        }
    }

    public 
    Pickup(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        if(
    GetClientTeam(client) == CS_TEAM_CT)
            
    holding[client] = false ;
    }

    public 
    Planted(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        if(
    GetClientTeam(client) == CS_TEAM_CT)
            
    holding[client] = false;
    }


    public 
    Planting(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        if(
    GetClientTeam(client) == CS_TEAM_CT && !GetConVarBool(g_canplant))
        {
            
    PrintToChatAll("\x04[CT-C4 \x04]\x03 Вы не можете ставить бомбу!");
            new 
    weapon GetEntPropEnt(clientProp_Data"m_hActiveWeapon");
         
            
    RemovePlayerItem(clientweapon);
         
            
    SetEntProp(clientProp_Send"m_iTeamNum"2);
            
    GivePlayerItem(client"weapon_c4");
            
    SetEntProp(clientProp_Send"m_iTeamNum"3);
            
    holding[client] = false;
        }
    }

    public 
    RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
    }

    public 
    RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        for(new 
    1<= MaxClientsi++)
        {
            if(
    IsClientInGame(i) && GetClientTeam(i) == CS_TEAM_CT)
                
    holding[i] = false;
        }
    }

    public 
    Action:WaitCheck(Handle:timer)
    {
        
    wait false;
    }
    --- Добавлено позже ---
    Дайте угадаю... когда КТ выбрасывает бомбу индекс бомбы меняется? - в коде я этого не видел(( Если я прав то подскажите как отловить момент и получить индекс выкинутой бомбы игроком =) Спасибо.
     
    Последнее редактирование: 6 окт 2016
  6. Grey83

    Grey83

    Сообщения:
    317
    Симпатии:
    93
    @Колян, я смотрю ты в плагине много "лишнего" выкинул. :biggrin:
    Раз ты удалил из каллбэка RoundStart все действия, то почему бы не удалить сам хук на событие, 2 булевы переменные (b_message и bBomb) и хук изменение хендла h_message вместе с семим хендлом и кодом определения значения b_message?
    OnMapStart ты же уже удалил.

    А на кой тебе координаты бомбы?
     
  7. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.506
    Симпатии:
    1.961
    Практически. У КТ старая бомба удаляется:
    А уже новая даётся в руки:
    Просто получай индекс бомбы через (при условии, что бомба будет одна на карте):
    PHP:
    FindEntityByClassname(MaxClients 1"weapon_c4");
    Только не забудь проверить на -1, когда бомба не найдена. Также, после закладки на плент, она уже не определится, потому что это будет не weapon_c4, а planted_c4.
     
  8. Колян

    Колян

    Сообщения:
    107
    Симпатии:
    3
    Ребят.. плагин который дает возможность юзать бомбу КТ- не мой... я его подредакрировал (в лом было удалять ROundStart) т.к на работу плагина не влияет...

    На карте будетнесколько бомб... как отловить момент выкидывания бомбы игроком? и как получить индекс выкинутой бомбы в моем случае чтоб не было ошибки?
    --- Добавлено позже ---
    PHP:
    public Dropped(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        if(
    IsClientConnected(client) && IsClientInGame(client) && GetClientTeam(client) == CS_TEAM_CT)
        {
            
    wait true;
            
    CreateTimer(0.5WaitCheck);
            
    holding[client] = false;
        }
    }
    Вот что срабатывает в момент выкидывания бомбы (простона 0.5 сек не даем бомбе браться игроку .. чтоб не взять ее обратно)... смены индекса бомбы тут не вижу(
     
  9. Grey83

    Grey83

    Сообщения:
    317
    Симпатии:
    93
    просто я когда-то давно игрался с этим плагином (чуть подправил его себе для CSGO) и исходник до сих пор на винте валяется
    только вот не вспомню где я сам исходник брал
    то ли так сильно изменил его, то ли хз
    правда я у себя убирал вообще возможность плантить бомбу для спецов

    И ещё одно: у тебя же есть хук на событие.
    Пользуйся
     
  10. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    819
    Симпатии:
    521
    Grey83 и AlmazON нравится это.
  11. Колян

    Колян

    Сообщения:
    107
    Симпатии:
    3
    Про юзеры помогайте, да, задача не простая )
     
  12. Grey83

    Grey83

    Сообщения:
    317
    Симпатии:
    93
    PHP:
    public Dropped(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        new 
    bomb GetEventInt(event"entindex"); // вот тебе индекс энтити, юзай на здоровье его как хочешь
        
    if(IsClientConnected(client) && IsClientInGame(client) && GetClientTeam(client) == CS_TEAM_CT)
        {
            
    wait true;
            
    CreateTimer(0.5WaitCheck);
            
    holding[client] = false;
        }
    }
     
  13. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.506
    Симпатии:
    1.961
    Тогда действительно, зачем эти координаты? Ведь можно пройтись циклом по той же функции и получить любое количество бомб. Другое дело, что нужна какая-то определённая.
    Доступно только для CS:GO.
     
  14. Grey83

    Grey83

    Сообщения:
    317
    Симпатии:
    93
    с чего бы ей быть непростой?
    Вот у меня проблема с поворотом пропа вокруг его осей, да, непростая. Уже несколько месяцев не могу понять как реализовать.
    А тут на полминуты дела.
     
  15. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    819
    Симпатии:
    521
    @Grey83, TeleportEntity же принимает в качестве аргументов возможную новую ротацию. В чём проблема-то?
     
  16. Колян

    Колян

    Сообщения:
    107
    Симпатии:
    3
    CrazyHackGUT - твой 1 коммент мне помог. Спасибо тебе и всем кто принял участие =)
     
  17. Grey83

    Grey83

    Сообщения:
    317
    Симпатии:
    93
    @CrazyHackGUT, в том, что телепорт вращает относительно осей карты, а не пропа.
    В одном плагине есть код вращения относительно оси Y пропа, но как его модифицировать для вращения относительно других осей не вкурю.
    Думаю м/б менять местами оси в функции перед поворотом, а после, перед выводом, менять обратно?
    PHP:
    RotateYawFloat:angles[3], Float:degree // здесь добавить параметр с индексом оси
    {
        
    decl Float:direction[3], Float:normal[3]; // здесь буферную векторную переменную и переназначение осей
        
    GetAngleVectorsanglesdirectionNULL_VECTORnormal );
     
        new 
    Float:sin Sinedegree 0.01745328 );     // Pi/180
        
    new Float:cos Cosinedegree 0.01745328 );
        new 
    Float:normal[0] * sin;
        new 
    Float:normal[1] * sin;
        new 
    Float:normal[2] * sin;
        new 
    Float:direction[2] * direction[0] * cos direction[1] * c;
        new 
    Float:direction[0] * direction[1] * cos direction[2] * a;
        new 
    Float:direction[1] * direction[2] * cos direction[0] * b;
        
    direction[0] = x;
        
    direction[1] = y;
        
    direction[2] = z;
     
        
    GetVectorAnglesdirectionangles );

        
    decl Float:up[3];
        
    GetVectorVectorsdirectionNULL_VECTORup );

        new 
    Float:roll GetAngleBetweenVectorsupnormaldirection );
        
    angles[2] += roll//здесь вернуть оси на свои места
    }
    А вообще сам плагин уже перевалил за 1000 строк кода (я даже для удобства разбил его на 5 кусков).
    Позволяет перемещать пропы относительно осей самого пропа и мира, копировать просто и со смещением относительно пропа (стены или мосты строить удобно), вращать относительно осей мира и оси Y пропа.
    И во время всего этого непотребства ещё и отображаются границы предмета и оси, относительно которых идёт смещение/поворот.

    Планировалось что-то вроде существующих плагинов стройки для HL2DM и L4D2.
    Если интересно, то могу накидать скринов плагина в работе.
    Правда там ещё пилить и пилить (добавить возможность спавнить пропы из меню, а не просто копировать имеющиеся, добавить БД, чтобы сэйвить постройки и прочее).
    Хотя вышеописанный функцианал пашет давно.
     
    Последнее редактирование: 6 окт 2016
  18. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    819
    Симпатии:
    521
    В теории можно получить текущую ротацию и добавить к ней свои оси.
    @Колян, благодарность принято на форуме выражать кнопкой "Мне нравится" на нужном посту :)
     
  19. Grey83

    Grey83

    Сообщения:
    317
    Симпатии:
    93
    каким образом?
    Не таким ли, как я выше процитировал?

    Кстати, плагин позволяет такое строить:
    [​IMG]
    Здесь старое отображение осей. Сейчас такого нет.
    [​IMG]
    [​IMG]
    [​IMG]
    Сами скрины ещё летом делал

    Кстати, плагин должен ещё делать правильное открытие дверей (в смысле, если наклонил дверь, то она будет открываться как будто вращается на петлях, а не вокруг вертикальной оси относительно мира).