Нужна помощь по настройке предмета в NS

AlterFranky

Пользователь
Проверенный
Всем доброго вечера, нашел и немножко изменил я предмет под названием NAIL (который каким то чудом оказался в note+ плагине).
Этот предмет замораживает проп при использовании.
У него есть одна функция "Зафиксировать", мне нужно сделать еще одну противоположную. Что бы была функция "Расфиксировать".
Вот код

ITEM.name = "Набор инструментов"
ITEM.desc = "Набор инструментов, можно использовать для фиксации мебели"
ITEM.model = "models/props_industrial/smalltoolbox.mdl"
ITEM.Width = 1
ITEM.Height = 1
ITEM.price = 5
ITEM.permit = "mat"

ITEM.functions.Nail = {
name = "Зафиксировать",
icon = "icon16/anchor.png",
onRun = function(item)

local function MakeNail( Ent1, Ent2, Bone1, Bone2, forcelimit, Pos, Ang )

local constraint = constraint.Weld( Ent1, Ent2, Bone1, Bone2, forcelimit, false )

constraint.Type = "Nail"
constraint.Pos = Pos
constraint.Ang = Ang

Pos = Ent1:LocalToWorld( Pos )
Ent1:GetPhysicsObject():EnableMotion(false);

local nail = ents.Create( "gmod_nail" )
nail:SetPos( Pos )
nail:SetAngles( Ang )
nail:SetParentPhysNum( Bone1 )
nail:SetParent( Ent1 )

nail:Spawn()
nail:Activate()

constraint:DeleteOnRemove( nail )

return constraint, nail
end
local player = item.player
local trace = player:GetEyeTrace()
// Bail if we hit world or a player
if ( !trace.Entity:IsValid() || trace.Entity:IsPlayer() ) then return false end

// If there's no physics object then we can't constraint it!
if ( SERVER && !util.IsValidPhysicsObject( trace.Entity, trace.PhysicsBone ) ) then return false end

local tr = {}
tr.start = trace.HitPos
tr.endpos = trace.HitPos + (player:GetAimVector() * 16.0)
tr.filter = { player, trace.Entity }
local trTwo = util.TraceLine( tr )

if ( trTwo.Hit && !trTwo.Entity:IsPlayer() ) then

// Get clients CVars
local forcelimit = "100"

// Client can bail now
if ( CLIENT ) then return true end

local vOrigin = trace.HitPos - (player:GetAimVector() * 8.0)
local vDirection = player:GetAimVector():Angle()

vOrigin = trace.Entity:WorldToLocal( vOrigin )

// Weld them!
local constraint, nail = MakeNail( trace.Entity, trTwo.Entity, trace.PhysicsBone, trTwo.PhysicsBone, forcelimit, vOrigin, vDirection )
if !constraint:IsValid() then return end

return true
end
end,
onCanRun = function(item)
return !IsValid(item.entity)
end
}
 
Гвоздик, который прикрепляет предмет, исчезает при использовании. Впихивать в него функцию снятия не вариант.
Как таковой, можно создать либо молоточек, с помощью которого можно будет вновь заставить объект двигаться, либо добавить nut-команду.

P.S. Исходный код желательно прятать под спойлер в код (особенно, если исходник имеет достаточные размеры).
 
Гвоздик, который прикрепляет предмет, исчезает при использовании. Впихивать в него функцию снятия не вариант.
Как таковой, можно создать либо молоточек, с помощью которого можно будет вновь заставить объект двигаться, либо добавить nut-команду.

P.S. Исходный код желательно прятать под спойлер в код (особенно, если исходник имеет достаточные размеры).
Я убрал функцию исчезания у гвоздика. Так знаете как сделать?
 
Попробуй что-то в этом роде:
Код:
ITEM.functions.UnNail =
{
    name = "Расфиксировать",
    icon = "icon16/anchor.png",
    onRun = function(item)
        local client = item.player;
        local trace = client:GetEyeTrace();

        if (!trace.Entity:IsValid() or trace.Entity:IsPlayer()) then return false end;
        if (SERVER and !util.IsValidPhysicsObject(trace.Entity, trace.PhysicsBone)) then return false end;

        local tr = {};
        tr.start = trace.HitPos;
        tr.endpos = trace.HitPos + (player:GetAimVector() * 16);
        tr.filter = {player, trace.Entity};

        local trTwo = util.TraceLine(tr);
        if (trTwo.Hit and !trTwo.Entity:IsPlayer()) then
            trace.Entity:GetPhysicsObject():EnableMotion(true);
        end;

        return false;
    end,
    onCanRun = function(item)
        return !IsValid(item.entity);
    end;
};
Тестировать не тестировалось, потому произойти может что угодно.
 
Попробуй что-то в этом роде:
Код:
ITEM.functions.UnNail =
{
    name = "Расфиксировать",
    icon = "icon16/anchor.png",
    onRun = function(item)
        local client = item.player;
        local trace = client:GetEyeTrace();

        if (!trace.Entity:IsValid() or trace.Entity:IsPlayer()) then return false end;
        if (SERVER and !util.IsValidPhysicsObject(trace.Entity, trace.PhysicsBone)) then return false end;

        local tr = {};
        tr.start = trace.HitPos;
        tr.endpos = trace.HitPos + (player:GetAimVector() * 16);
        tr.filter = {player, trace.Entity};

        local trTwo = util.TraceLine(tr);
        if (trTwo.Hit and !trTwo.Entity:IsPlayer()) then
            trace.Entity:GetPhysicsObject():EnableMotion(true);
        end;

        return false;
    end,
    onCanRun = function(item)
        return !IsValid(item.entity);
    end;
};
Тестировать не тестировалось, потому произойти может что угодно.
Такой скромный вопрос, а куда впихивать данный код?
 
Попробуй что-то в этом роде:
Код:
ITEM.functions.UnNail =
{
    name = "Расфиксировать",
    icon = "icon16/anchor.png",
    onRun = function(item)
        local client = item.player;
        local trace = client:GetEyeTrace();

        if (!trace.Entity:IsValid() or trace.Entity:IsPlayer()) then return false end;
        if (SERVER and !util.IsValidPhysicsObject(trace.Entity, trace.PhysicsBone)) then return false end;

        local tr = {};
        tr.start = trace.HitPos;
        tr.endpos = trace.HitPos + (player:GetAimVector() * 16);
        tr.filter = {player, trace.Entity};

        local trTwo = util.TraceLine(tr);
        if (trTwo.Hit and !trTwo.Entity:IsPlayer()) then
            trace.Entity:GetPhysicsObject():EnableMotion(true);
        end;

        return false;
    end,
    onCanRun = function(item)
        return !IsValid(item.entity);
    end;
};
Тестировать не тестировалось, потому произойти может что угодно.
Lua ошибок не было, но функция не рабочая
 
Назад
Сверху