Новый парашют

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #1
Мне не понравилось, что парашют юзает OnGameFrame. Решил попробывать сделать через OnPlayerRunCmd.

Кому не сложно протестируйте и отпишитесь.

http://hlmod.ru/forum/showpost.php?p=142288&postcount=6
 
Последнее редактирование:

acik_traiks

Что нибудь напишем?)
Сообщения
770
Реакции
627
R1KO, я смотрю ты запретил после прыжка использовать, но вот если кто нибудь с большой высоты под прыгнит и нажмет Е, а ему фига) будет весело вроде нормально но он без модели
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3

acik_traiks

Что нибудь напишем?)
Сообщения
770
Реакции
627
R1KO, не знаю но он дает после прыжка использовать только с какой ерунды сваливаться
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #5
acik, тоже это заметил, думаю как исправить
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #6
В общем это работает:
PHP:
#include <sourcemod>
#include <sdktools>
#pragma semicolon 1

public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
    if (IsPlayerAlive(client))
	{
		static bool:g_InUse[MAXPLAYERS+1];
		if(!g_InUse[client] && (buttons & IN_USE) && !(GetEntityFlags(client) & FL_ONGROUND))
		{
			SetEntityGravity(client, 0.1);
			g_InUse[client] = true;
		}
		else if (!(buttons & IN_USE) && g_InUse[client])
		{
			SetEntityGravity(client, 1.0);
			g_InUse[client] = false;
		}
	}
    return Plugin_Continue;
}

НО если зажать пробел и E, то улетаешь в прямом смысле слова, тоесть грава становится 0,1.
Вопрос к скриптерам: как это исправить?

Такой способ ничего не дал:
PHP:
#include <sourcemod>
#include <sdktools>
#pragma semicolon 1

new g_iVelocity = -1;

public OnPluginStart() g_iVelocity = FindSendPropOffs("CBasePlayer", "m_vecVelocity[0]");

public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
    if (IsPlayerAlive(client))
	{
		static bool:g_InUse[MAXPLAYERS+1];
		if(!g_InUse[client] && (buttons & IN_USE) && !(GetEntityFlags(client) & FL_ONGROUND))
		{
			decl Float:fVelocity[3];
			GetEntDataVector(client, g_iVelocity, fVelocity);
			if(fVelocity[2] < 0.0)
			{
				fVelocity[2] = (fVelocity[2] >= -100.0) ? -100.0:(fVelocity[2] +50.0);
				TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, fVelocity);
				SetEntDataVector(client, g_iVelocity, fVelocity);
				SetEntityGravity(client, 0.1);
				g_InUse[client] = true;
			}
		}
		else if (!(buttons & IN_USE) && g_InUse[client])
		{
			SetEntityGravity(client, 1.0);
			g_InUse[client] = false;
		}
	}
    return Plugin_Continue;
}
 

Webman

Nevermind
Сообщения
803
Реакции
330
Оффтоп
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #8
Webman, он вызывается 66 раз в секунду. Мне не нравится 66 раз в секунду проверять не зажата ли кнопка у каждого игрока
 

NagarD

Участник
Сообщения
411
Реакции
184
удаляй флаг пробела при нажатой Е \и если игрок не на земле buttons &= ~IN_ПРОБЕЛ
OnPlayerRunCmd тоже 66 раз в сек вызывается
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #14
FrozDark,
Если ты имел ввиду тут:
PHP:
if(fVelocity[2] <= 0.0) // тут
            {
                fVelocity[2] = (fVelocity[2] >= -100.0) ? -100.0:(fVelocity[2] +50.0);
                TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, fVelocity);
                SetEntDataVector(client, g_iVelocity, fVelocity);
                SetEntityGravity(client, 0.1);
                g_InUse[client] = true;
            }
То не помогло
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #15
Minus, работает)
Но мне кажется
PHP:
if (IsPlayerAlive(client)) 
    { 
        static bool:g_InUse[MAXPLAYERS+1]; 
        decl Float:fVelocity[3]; // постоянно создаем эту переменную ...
        GetEntDataVector(client, g_iVelocity, fVelocity); // и это делаем постоянно хотя должны только когда нажата Е
        if(!g_InUse[client] && (buttons & IN_USE) && !(GetEntityFlags(client) & FL_ONGROUND)) 
        { 
            if(fVelocity[2] < 0.0) 
            { 
                fVelocity[2] = (fVelocity[2] >= -100.0) ? -100.0:(fVelocity[2] +50.0); 
                TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, fVelocity); 
                SetEntDataVector(client, g_iVelocity, fVelocity); 
                SetEntityGravity(client, 0.1); 
                g_InUse[client] = true; 
            } 
        } 
        else if (!(buttons & IN_USE) && g_InUse[client]) 
        { 
            SetEntityGravity(client, 1.0); 
            g_InUse[client] = false; 
        } 
        else if(fVelocity[2] >= 0.0) SetEntityGravity(client, 1.0); 
    }
 

Monroe

Участник
Сообщения
25
Реакции
35
PHP:
#include <sourcemod>
#include <sdktools>
#pragma semicolon 1

new g_iVelocity = -1;

public OnPluginStart() g_iVelocity = FindSendPropOffs("CBasePlayer", "m_vecVelocity[0]");

public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)
{
	if (IsPlayerAlive(client))
	{
		static bool:g_InUse[MAXPLAYERS+1], Float:fVelocity[MAXPLAYERS+1][3];
		GetEntDataVector(client, g_iVelocity, fVelocity[client]); //Что в этом страшного? (сама функция передает Velocity столько же раз, только в другой плоскости)
		if(!g_InUse[client] && (buttons & IN_USE) && !(GetEntityFlags(client) & FL_ONGROUND))
		{
			if(fVelocity[client][2] < 0.0)
			{
				fVelocity[client][2] = (fVelocity[client][2] >= -100.0) ? -100.0:(fVelocity[client][2] +50.0);
				TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, fVelocity[client]);
				SetEntDataVector(client, g_iVelocity, fVelocity[client]);
				SetEntityGravity(client, 0.1);
				g_InUse[client] = true;
			}
		}
		else if (!(buttons & IN_USE) && g_InUse[client])
		{
			SetEntityGravity(client, 1.0);
			g_InUse[client] = false;
		}
		else if(fVelocity[client][2] >= 0.0) SetEntityGravity(client, 1.0);
	}
	return Plugin_Continue;
}
 
  • Мне нравится
Реакции: R1KO

Monroe

Участник
Сообщения
25
Реакции
35
static инициализируется только один раз. Если делать, как ты говоришь, то нужно объявлять переменные глобально, чтобы не объявлять ее, например, 66 раз в секунду, а зачем объявлять их глобально, если они больше не используются.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #19
Minus, для этого нужен static
 
Последнее редактирование:
Сверху Снизу