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

Колян

Участник
Сообщения
180
Реакции
5
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);
 

Колян

Участник
Сообщения
180
Реакции
5
Нужно именно этого оружия .... например если он его выкинет то нужно продолжать брать координаты оружия.
 

Колян

Участник
Сообщения
180
Реакции
5
Умолчал важную деталь. Я пользуюсь плагином который позволяет КТ брать бомбу. Когда я беру координату бомбы (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(client, SDKHook_Touch, Touch);
}

public Touch(ent1, ent2)
{
    if(!wait && !holding[ent1])
    {
        if(ent1 > 0 && ent1 <= MaxClients && IsPlayerAlive(ent1) && GetClientTeam(ent1) == CS_TEAM_CT)
        {
            decl String:name[50];
            GetEdictClassname(ent2, name, 50);
         
            if(StrContains(name, "weapon_c4") != -1)
            {
                SetEntProp(ent1, Prop_Send, "m_iTeamNum", 2);
                RemoveEdict(ent2);
                GivePlayerItem(ent1, "weapon_c4");
                SetEntProp(ent1, Prop_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.5, WaitCheck);
        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(client, Prop_Data, "m_hActiveWeapon");
     
        RemovePlayerItem(client, weapon);
     
        SetEntProp(client, Prop_Send, "m_iTeamNum", 2);
        GivePlayerItem(client, "weapon_c4");
        SetEntProp(client, Prop_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 i = 1; i <= MaxClients; i++)
    {
        if(IsClientInGame(i) && GetClientTeam(i) == CS_TEAM_CT)
            holding[i] = false;
    }
}

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

Grey83

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

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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
когда КТ выбрасывает бомбу индекс бомбы меняется
Практически. У КТ старая бомба удаляется:
А уже новая даётся в руки:
GivePlayerItem(ent1, "weapon_c4");
Просто получай индекс бомбы через (при условии, что бомба будет одна на карте):
PHP:
FindEntityByClassname(MaxClients + 1, "weapon_c4");
Только не забудь проверить на -1, когда бомба не найдена. Также, после закладки на плент, она уже не определится, потому что это будет не weapon_c4, а planted_c4.
 

Колян

Участник
Сообщения
180
Реакции
5
Ребят.. плагин который дает возможность юзать бомбу КТ- не мой... я его подредакрировал (в лом было удалять 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.5, WaitCheck);
        holding[client] = false;
    }
}

Вот что срабатывает в момент выкидывания бомбы (простона 0.5 сек не даем бомбе браться игроку .. чтоб не взять ее обратно)... смены индекса бомбы тут не вижу(
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
просто я когда-то давно игрался с этим плагином (чуть подправил его себе для CSGO) и исходник до сих пор на винте валяется
только вот не вспомню где я сам исходник брал
то ли так сильно изменил его, то ли хз
правда я у себя убирал вообще возможность плантить бомбу для спецов

И ещё одно: у тебя же есть хук на событие.
Пользуйся
bomb_dropped
Note: When the bomb is dropped by a client

Name: bomb_dropped
Structure:
short userid player who dropped the bomb
long entindex
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
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.5, WaitCheck);
        holding[client] = false;
    }
}
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
На карте будетнесколько бомб
Тогда действительно, зачем эти координаты? Ведь можно пройтись циклом по той же функции и получить любое количество бомб. Другое дело, что нужна какая-то определённая.
new bomb = GetEventInt(event, "entindex"); // вот тебе индекс энтити, юзай на здоровье его как хочешь
Доступно только для CS:GO.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
Про юзеры помогайте, да, задача не простая )
с чего бы ей быть непростой?
Вот у меня проблема с поворотом пропа вокруг его осей, да, непростая. Уже несколько месяцев не могу понять как реализовать.
А тут на полминуты дела.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #15
@Grey83, TeleportEntity же принимает в качестве аргументов возможную новую ротацию. В чём проблема-то?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@CrazyHackGUT, в том, что телепорт вращает относительно осей карты, а не пропа.
В одном плагине есть код вращения относительно оси Y пропа, но как его модифицировать для вращения относительно других осей не вкурю.
Думаю м/б менять местами оси в функции перед поворотом, а после, перед выводом, менять обратно?
PHP:
RotateYaw( Float:angles[3], Float:degree ) // здесь добавить параметр с индексом оси
{
    decl Float:direction[3], Float:normal[3]; // здесь буферную векторную переменную и переназначение осей
    GetAngleVectors( angles, direction, NULL_VECTOR, normal );
 
    new Float:sin = Sine( degree * 0.01745328 );     // Pi/180
    new Float:cos = Cosine( degree * 0.01745328 );
    new Float:a = normal[0] * sin;
    new Float:b = normal[1] * sin;
    new Float:c = normal[2] * sin;
    new Float:x = direction[2] * b + direction[0] * cos - direction[1] * c;
    new Float:y = direction[0] * c + direction[1] * cos - direction[2] * a;
    new Float:z = direction[1] * a + direction[2] * cos - direction[0] * b;
    direction[0] = x;
    direction[1] = y;
    direction[2] = z;
 
    GetVectorAngles( direction, angles );

    decl Float:up[3];
    GetVectorVectors( direction, NULL_VECTOR, up );

    new Float:roll = GetAngleBetweenVectors( up, normal, direction );
    angles[2] += roll; //здесь вернуть оси на свои места
}

А вообще сам плагин уже перевалил за 1000 строк кода (я даже для удобства разбил его на 5 кусков).
Позволяет перемещать пропы относительно осей самого пропа и мира, копировать просто и со смещением относительно пропа (стены или мосты строить удобно), вращать относительно осей мира и оси Y пропа.
И во время всего этого непотребства ещё и отображаются границы предмета и оси, относительно которых идёт смещение/поворот.

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

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #18
телепорт вращает относительно осей карты, а не пропа
В теории можно получить текущую ротацию и добавить к ней свои оси.
@Колян, благодарность принято на форуме выражать кнопкой "Мне нравится" на нужном посту :)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
В теории можно получить текущую ротацию и добавить к ней свои оси.
каким образом?
Не таким ли, как я выше процитировал?

Кстати, плагин позволяет такое строить:
EF04020166641663FA5507AB01F93D97EBFAAC42

Здесь старое отображение осей. Сейчас такого нет.
6BB5465D1C6788F5A619300DC9CF068D58C6BF06

3A702A4256BCBB0EEA9B879470AAE3523B0D6D61

92C958C523BAF68365971C2867E3C6C26E60B82B
Сами скрины ещё летом делал

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