This commit is contained in:
lifestorm
2024-08-04 22:55:00 +03:00
parent 8064ba84d8
commit 73479cff9e
7338 changed files with 1718883 additions and 14 deletions

View File

@@ -0,0 +1,268 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local PLUGIN = PLUGIN
local function firstUpper(str)
return (str:gsub("^%l", string.utf8upper))
end
net.Receive("ixVortNotes", function(len)
local count = net.ReadUInt(32)
local send = net.ReadUInt(32)
local received = send
if (received == 1) then
PLUGIN.vortnotes = {}
end
for i = send, math.min(count, send + PLUGIN.BATCH - 1) do
local k = net.ReadUInt(32)
PLUGIN.vortnotes[k] = net.ReadTable()
if (received == count) then
PLUGIN:OpenVortMenu(net.ReadUInt(32))
return
end
received = received + 1
end
end)
netstream.Hook("OpenVortessenceMenu", function(notes, lastSelected)
end)
local vortalVisionActive = false
local vortalVisionMat = Material("effects/vortal_vision.png")
local vortalVisionDLight = nil
netstream.Hook("ToggleVortalVision", function(bool)
if (bool and !vortalVisionActive) then
if !vortalVisionDLight then
vortalVisionDLight = DynamicLight(LocalPlayer():EntIndex())
end
hook.Add("RenderScreenspaceEffects", "VortalVisionRender", function()
if vortalVisionDLight then
vortalVisionDLight.pos = LocalPlayer():GetShootPos() + LocalPlayer():EyeAngles():Forward() * -100
vortalVisionDLight.r = 255
vortalVisionDLight.g = 255
vortalVisionDLight.b = 255
vortalVisionDLight.brightness = 1
vortalVisionDLight.Decay = 20000
vortalVisionDLight.Size = 8000
vortalVisionDLight.DieTime = CurTime() + 0.1
end
DrawColorModify({
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = -0.1,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 0,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
})
surface.SetDrawColor(255, 255, 255, 100)
surface.SetMaterial(vortalVisionMat)
surface.DrawTexturedRect(0, 0, ScrW(), ScrH())
end)
vortalVisionActive = true
else
hook.Remove("RenderScreenspaceEffects", "VortalVisionRender")
vortalVisionActive = false
end
end)
function PLUGIN:OpenVortMenu(lastSelected)
if IsValid(PLUGIN.ixVortessenceMenu) then
PLUGIN.ixVortessenceMenu:Remove()
end
PLUGIN.ixVortessenceMenu = vgui.Create("VortessenceMenu")
if lastSelected > 0 and PLUGIN.ixVortessenceMenu.buttonList and PLUGIN.ixVortessenceMenu.buttonList[lastSelected] then
PLUGIN.ixVortessenceMenu.buttonList[lastSelected].DoClick()
end
end
function PLUGIN:IsPlayerRecognized(target)
if LocalPlayer():IsVortigaunt() then
local vortrecognition = ix.data.Get("vortrecog", {}, false, true)
if (target:GetCharacter() and vortrecognition[target:GetCharacter():GetID()]) then
return true
end
end
end
function PLUGIN:GetCharacterName(target, chatType)
if LocalPlayer():IsVortigaunt() then
local vortrecognition = ix.data.Get("vortrecog", {}, false, true)
if target:GetCharacter() then
local fakeName = vortrecognition[target:GetCharacter():GetID()]
if (fakeName and fakeName != true) then
return fakeName
end
end
end
end
PLUGIN.minDist = 500 * 500
PLUGIN.maxDist = 20000 ^ 2
PLUGIN.traceFilter = {nil, nil}
local mat1 = CreateMaterial("GA0249aSFJ3","VertexLitGeneric",{
["$basetexture"] = "models/debug/debugwhite",
["$model"] = 1,
["$translucent"] = 1,
["$alpha"] = 1,
["$nocull"] = 1,
["$ignorez"] = 1
})
function PLUGIN:HUDPaint()
local client = LocalPlayer()
local isVortigaunt = client:IsVortigaunt()
if (client:GetMoveType() == MOVETYPE_NOCLIP and !client:InVehicle() and !isVortigaunt) then return end
if (!client:GetCharacter()) then return end
if (client:GetNetVar("ixVortNulled")) then return end
if client:GetNetVar("ixVortMeditation") then
surface.SetDrawColor( Color(38, 106, 46, (math.sin(CurTime() * 2) + 1) / 2 * 80) )
surface.SetMaterial(ix.util.GetMaterial("vgui/gradient-d"))
surface.DrawTexturedRect( 0, 0, ScrW(), ScrH() )
end
if (ix.option.Get("vortSensingDisable")) then return end
if (isVortigaunt) then
self.names = {}
local minDist, maxDist = self.minDist, self.maxDist
if (ix.char.loaded[self.voidChar] and IsValid(ix.char.loaded[self.voidChar]:GetPlayer())) then
local voidClient = ix.char.loaded[self.voidChar]:GetPlayer()
if (voidClient:GetMoveType() != MOVETYPE_NOCLIP or voidClient:InVehicle()) then
local pos = voidClient:GetPos()
local dist = pos:DistToSqr(voidClient:GetPos())
local offset = math.min(math.Remap(math.max(dist, 50 * 50), 50 * 50, 300 * 300, 0, 1), 1)
minDist, maxDist = minDist * offset, maxDist * offset
end
end
cam.Start3D()
local pos = client:EyePos()
self.traceFilter[1] = client
for _ , p in ipairs(player.GetAll()) do
if (p == client) then continue end
if (!p:GetCharacter()) then continue end
if (!IsValid(p) or !p:Alive() or (p:GetMoveType() == MOVETYPE_NOCLIP and !p:InVehicle())) then continue end
local vEyePos = p:EyePos()
local dist = vEyePos:DistToSqr(pos)
local voidChar = p:GetCharacter():GetID() == self.voidChar
local isVort = p:IsVortigaunt() and !p:GetNetVar("ixVortNulled")
if (voidChar or (dist < maxDist and isVort)) then
render.SuppressEngineLighting(true)
if (p:IsVortigaunt()) then
render.SetColorModulation(138/255, 181/255, 40/255)
else
render.SetColorModulation(0, 0, 0)
end
if (isVort) then
self.traceFilter[2] = p
local trace = util.QuickTrace(pos, vEyePos - pos, self.traceFilter)
if (util.QuickTrace(pos, vEyePos - pos, self.traceFilter).Fraction < 0.95 or client:FlashlightIsOn()) then
render.SetBlend(math.Remap(math.Clamp(dist, minDist, maxDist), minDist, maxDist, 1, 0))
else
render.SetBlend(math.Remap(math.Clamp(dist, minDist, maxDist), minDist, maxDist, 0.01, 0))
end
elseif (voidChar) then
render.SetBlend(math.Remap(math.max(dist, 100 * 100), 100 * 100, 600 * 600, 0.8, 0))
end
render.MaterialOverride(mat1)
p:DrawModel()
render.MaterialOverride()
render.SuppressEngineLighting(false)
if (!voidChar) then
self.names[#self.names + 1] = {p, dist}
end
end
end
cam.End3D()
self:RenderESPNames(minDist, maxDist)
end
end
function PLUGIN:CharacerLoaded(character)
if self.dlight then
self.dlight = nil
end
end
function PLUGIN:CharacterAdjustModelPanelLookupBone(character)
if (character:IsVortigaunt()) then
return "ValveBiped.head"
end
end
function PLUGIN:GetCharacterGeneticDescription(character)
if (character:IsVortigaunt()) then
local geneticAge = string.utf8lower(LocalPlayer():GetCharacter():GetAge())
local geneticHeight = string.utf8lower(LocalPlayer():GetCharacter():GetHeight())
return firstUpper(geneticAge).." | "..firstUpper(geneticHeight), "genetics"
end
end
function PLUGIN:CreateStoreViewContents(panel, data, entity)
if (entity and IsValid(entity)) then
if (entity:IsPlayer() and entity:IsVortigaunt()) then
panel.storageInventory.isVortigauntOwner = true
end
end
end
local path = "willardnetworks/tabmenu/inventory/equipslots/icon-"
local partPaintsVort = {
[1] = {icon = ix.util.GetMaterial(path.."vorthead.png"), category = "Head"},
[3] = {icon = ix.util.GetMaterial(path.."collar.png"), category = "Face"},
[5] = {icon = ix.util.GetMaterial(path.."meat.png"), category = "Hands"},
[6] = {icon = ix.util.GetMaterial(path.."shackles.png"), category = "Legs"},
[7] = {icon = ix.util.GetMaterial(path.."hooks.png"), category = "Shoes"}
}
function PLUGIN:GetEquipSlotsPartPaints(panel, openedStorage)
local isVortigaunt = openedStorage and LocalPlayer():IsVortigaunt() or panel.isVortigauntOwner
if (isVortigaunt) then
return partPaintsVort
end
end
function PLUGIN:CanEquipSlot(panel, openedStorage, slot)
local isVortigaunt = openedStorage and LocalPlayer():IsVortigaunt() or panel.isVortigauntOwner
if (isVortigaunt and slot == 10) then
return false
end
end

View File

@@ -0,0 +1,43 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local PLUGIN = PLUGIN
function PLUGIN:RenderESPNames(minDist, maxDist)
local right = LocalPlayer():GetRight() * 25
local scrW, scrH = ScrW(), ScrH()
local marginX, marginY = scrH * .1, scrH * .1
for _, v in ipairs(self.names) do
local ply, distance = v[1], math.Clamp(v[2], minDist, maxDist)
local plyPos = ply:GetPos()
local min, max = ply:GetModelRenderBounds()
min = min + plyPos + right
max = max + plyPos + right
local barMin = Vector((min.x + max.x) / 2, (min.y + max.y) / 2, min.z):ToScreen()
local barMax = Vector((min.x + max.x) / 2, (min.y + max.y) / 2, max.z):ToScreen()
local eyePos = ply:EyePos():ToScreen()
local rightS = math.min(math.max(barMin.x, barMax.x), eyePos.x + 150)
local barWidth = math.Remap(distance, minDist, maxDist, 120, 75)
local barHeight = math.abs(barMax.y - barMin.y)
local barX, barY = math.Clamp(rightS, marginX, scrW - marginX - barWidth), math.Clamp(barMin.y - barHeight + 18, marginY, scrH - marginY)
surface.SetFont("ixGenericFont")
local width, height = surface.GetTextSize(ply:Name())
surface.SetDrawColor(0, 0, 0, math.Remap(distance, minDist, maxDist, 175, 50))
surface.DrawRect(barX - 5, barY - 13 - height / 2, width + 10, height + 2)
ix.util.DrawText(ply:Name(), barX, barY - 13, Color(138, 181, 40, math.Remap(distance, minDist, maxDist, 255, 50)), TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER, "ixGenericFont", 255)
end
end

View File

@@ -0,0 +1,314 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local PANEL = {}
local PLUGIN = PLUGIN
function PANEL:Init()
self:SetSize(ScrW(), ScrH())
self.Paint = function(self, w, h)
surface.SetDrawColor(Color(58, 115, 71, 80))
surface.DrawRect(0, 0, w, h)
Derma_DrawBackgroundBlur( self, 1 )
surface.SetDrawColor(ColorAlpha(color_white, 5))
surface.SetMaterial(ix.util.GetMaterial("willardnetworks/vortessence.png"))
surface.DrawTexturedRect(0, 0, w, h)
end
self.main = self:Add("EditablePanel")
self.main:SetSize(SScaleMin(700 / 3), SScaleMin(600 / 3))
self.main:Center()
self.main:MakePopup()
Schema:AllowMessage(self.main)
self.main.Paint = function(self, w, h)
surface.SetDrawColor(0, 0, 0, 130)
surface.DrawRect(0, 0, w, h)
end
self:CreateTopTitle(self.main)
self:CreateButtons(self.main)
end
function PANEL:CreateTopTitle(parent)
local topbar = parent:Add("Panel")
topbar:SetSize(parent:GetWide(), SScaleMin(50 / 3))
topbar:Dock(TOP)
topbar.Paint = function( self, w, h )
surface.SetDrawColor(0, 0, 0, 130)
surface.DrawRect(0, 0, w, h)
end
local titleText = topbar:Add("DLabel")
titleText:SetFont("CharCreationBoldTitleNoClamp")
titleText:Dock(LEFT)
titleText:SetText("La Vortessence")
titleText:DockMargin(SScaleMin(10 / 3), 0, 0, 0)
titleText:SetContentAlignment(4)
titleText:SizeToContents()
local exit = topbar:Add("DImageButton")
exit:SetImage("willardnetworks/tabmenu/navicons/exit.png")
exit:SetSize(SScaleMin(20 / 3), SScaleMin(20 / 3))
exit:DockMargin(SScaleMin(-200 / 3), SScaleMin(15 / 3), SScaleMin(10 / 3), SScaleMin(15 / 3))
exit:Dock(RIGHT)
exit.DoClick = function()
self:Remove()
surface.PlaySound("helix/ui/press.wav")
end
end
local function GreenOutlineButton(self, w, h)
surface.SetDrawColor(Color(0, 0, 0, 100))
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(Color(112, 135, 111, (255 / 100 * 30)))
surface.DrawOutlinedRect(0, 0, w, h)
end
function PANEL:CreateButtons(parent)
local buttonPanel = parent:Add("Panel")
buttonPanel:Dock(LEFT)
buttonPanel:SetWide(parent:GetWide() / 3.5)
buttonPanel.Paint = function(self, w, h)
surface.SetDrawColor(0, 0, 0, 50)
surface.DrawRect(0, 0, w, h)
end
local searchBar = buttonPanel:Add("DTextEntry")
searchBar:Dock(TOP)
searchBar:SetFont("MenuFontNoClamp")
searchBar:SetSize(SScaleMin(200 / 3), SScaleMin(30 / 3))
searchBar:DockMargin(0, 0, 0, SScaleMin(10 / 3))
searchBar:SetPlaceholderText("Search note title...")
searchBar:SetTextColor(Color(200, 200, 200, 255))
searchBar:SetCursorColor(Color(200, 200, 200, 255))
searchBar:SetFont("MenuFontNoClamp")
searchBar:SetText(value or "")
searchBar.Paint = function(panel, w, h)
surface.SetDrawColor(Color(0, 0, 0, 100))
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(Color(111, 111, 136, (255 / 100 * 30)))
surface.DrawOutlinedRect(0, 0, w, h)
if ( panel.GetPlaceholderText and panel.GetPlaceholderColor and panel:GetPlaceholderText() and
panel:GetPlaceholderText():Trim() != "" and panel:GetPlaceholderColor() and ( !panel:GetText() or panel:GetText() == "" ) ) then
local oldText = panel:GetText()
local str = panel:GetPlaceholderText()
if ( str:StartWith( "#" ) ) then str = str:sub( 2 ) end
str = language.GetPhrase( str )
panel:SetText( str )
panel:DrawTextEntryText( panel:GetPlaceholderColor(), panel:GetHighlightColor(), panel:GetCursorColor() )
panel:SetText( oldText )
return
end
panel:DrawTextEntryText( panel:GetTextColor(), panel:GetHighlightColor(), panel:GetCursorColor() )
end
searchBar.OnChange = function(searchSelf)
local text = searchSelf:GetValue()
if self.content and text != nil then
-- Clear existing rows
self.content:Clear()
local category = self.content.category -- Get the selected category from the content panel
for _, v in SortedPairs(PLUGIN.vortnotes, true) do
if v.note_category and tonumber(v.note_category) == category then
if string.find(string.lower(v.note_title), string.lower(text), 1, true) then
self:CreateRow(self.content, v, category)
end
end
end
self:CreateAdd(self.content, category)
end
end
self.buttonList = {}
for i = 1, 3 do
local charInfoButton = i == 1
local eventButton = i == 2
local charOrEvent = (charInfoButton or eventButton)
local info = buttonPanel:Add("DButton")
info:SetTall(SScaleMin(50 / 3))
info:SetFont("TitlesFontNoClamp")
info:Dock(TOP)
info:DockMargin(0, 0, 0, -1)
info:SetText(charInfoButton and "Note de personnage" or eventButton and "Notes sur l'événement" or "Notes générales")
info.Paint = function(self, w, h)
GreenOutlineButton(self, w, h)
end
info.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
if self.content then
self.content:Remove()
end
searchBar:SetText("")
self:CreateContent(self.main, i)
end
table.insert(self.buttonList, info)
end
end
function PANEL:CreateContent(parent, info)
self.content = parent:Add("DScrollPanel")
self.content:Dock(FILL)
self.content.name = info == 1 and "Note de personnage" or info == 2 and "Notes sur l'événement" or "Notes générales"
self.content.category = info
self:CreateTitleLabel(self.content)
for _, v in SortedPairs(PLUGIN.vortnotes, true) do
if v.note_category and tonumber(v.note_category) == info then
self:CreateRow(self.content, v, info)
end
end
self:CreateAdd(self.content, info)
end
function PANEL:CreateTitleLabel(parent, text)
self.titleLabel = parent:Add("DLabel")
self.titleLabel:Dock(TOP)
self.titleLabel:SetText(text or parent.name or "")
self.titleLabel:DockMargin(0, SScaleMin(15 / 3), 0, SScaleMin(14 / 3))
self.titleLabel:SetFont("TitlesFontNoClamp")
self.titleLabel:SetContentAlignment(5)
end
function PANEL:CreateDivider(parent)
local divider = parent:Add("DShape")
divider:SetType("Rect")
divider:Dock(RIGHT)
divider:SetWide(1)
divider:DockMargin(0, SScaleMin(10 / 3), SScaleMin(10 / 3), SScaleMin(10 / 3))
divider:SetColor(Color(112, 135, 111, (255 / 100 * 30)))
end
function PANEL:CreateRow(parent, rowInfo, category)
local row = parent:Add("DButton")
row:Dock(TOP)
row:SetTall(SScaleMin(50 / 3))
row:SetText(rowInfo["note_title"] or "")
row:SetContentAlignment(4)
row:SetFont("TitlesFontNoClamp")
row:SetTextInset(SScaleMin(10 / 3), 0)
row:DockMargin(0, 0, 0, -1)
row.Paint = function(self, w, h)
GreenOutlineButton(self, w, h)
end
if CAMI.PlayerHasAccess(client, "Helix - Manage Vortessence Menu") then
local delete = row:Add("DImageButton")
delete:SetImage("willardnetworks/tabmenu/navicons/exit.png")
delete:SetSize(SScaleMin(20 / 3), SScaleMin(20 / 3))
delete:DockMargin(0, SScaleMin(15 / 3), SScaleMin(10 / 3), SScaleMin(15 / 3))
delete:Dock(RIGHT)
delete.DoClick = function()
netstream.Start("RemoveNoteVortessence", rowInfo["note_id"], category)
surface.PlaySound("helix/ui/press.wav")
end
self:CreateDivider(row)
end
local date = row:Add("DLabel")
date:Dock(RIGHT)
date:SetFont("TitlesFontNoClamp")
date:SetText(rowInfo["note_date"] or "")
date:SetContentAlignment(6)
date:SizeToContents()
date:DockMargin(0, 0, SScaleMin(10 / 3), 0)
self:CreateDivider(row)
local name = row:Add("DLabel")
name:Dock(RIGHT)
name:SetFont("TitlesFontNoClamp")
name:SetText(rowInfo["note_poster"] or "")
name:SetContentAlignment(6)
name:SizeToContents()
name:DockMargin(0, 0, SScaleMin(10 / 3), 0)
row.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
parent:Clear()
self:CreateTitleLabel(parent, rowInfo["note_title"])
self:CreateNoteText(parent, rowInfo)
end
end
function PANEL:CreateNoteText(parent, rowInfo)
local wrappedText = parent:Add("DLabel")
wrappedText:SetFont("MenuFontNoClamp")
wrappedText:SetText(rowInfo["note_text"] or "")
wrappedText:SetWrap(true)
wrappedText:Dock(TOP)
wrappedText:SetAutoStretchVertical(true)
wrappedText:DockMargin(SScaleMin(10 / 3), 0, SScaleMin(10 / 3), 0)
end
function PANEL:CreateAdd(parent, category)
local add = parent:Add("DButton")
add:Dock(TOP)
add:SetTall(SScaleMin(50 / 3))
add:SetText("Ajouter une note")
add:SetFont("TitlesFontNoClamp")
add.Paint = function(self, w, h)
surface.SetDrawColor(Color(112, 135, 111, (255 / 100 * 10)))
surface.DrawRect(0, 0, w, h)
GreenOutlineButton(self, w, h)
end
add.DoClick = function()
surface.PlaySound("helix/ui/press.wav")
Derma_StringRequest(
"Ajouter une note | "..parent.name,
"Définir le texte de votre note :",
"",
function(title)
if string.len(title) <= 0 then
LocalPlayer():NotifyLocalized("Vous ne pouvez pas entrer un titre vide !")
return false
end
surface.PlaySound("helix/ui/press.wav")
Derma_StringRequest(
"Ajouter une note | "..parent.name,
"Définir le texte de votre note :",
"",
function(text)
netstream.Start("AddNoteVortessence", title, text, category)
end
)
end
)
end
end
vgui.Register("VortessenceMenu", PANEL, "EditablePanel")

View File

@@ -0,0 +1,84 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local smoke = {
"particle/smokesprites_0001",
"particle/smokesprites_0002",
"particle/smokesprites_0003",
"particle/smokesprites_0004",
"particle/smokesprites_0005",
"particle/smokesprites_0006",
"particle/smokesprites_0007",
"particle/smokesprites_0008",
"particle/smokesprites_0009",
"particle/smokesprites_0010",
"particle/smokesprites_0011",
"particle/smokesprites_0012",
"particle/smokesprites_0013",
"particle/smokesprites_0014",
"particle/smokesprites_0015",
"particle/smokesprites_0016"
}
function EFFECT:Init( data )
local vOffset = data:GetOrigin()
local emitter = ParticleEmitter( vOffset, false )
for i = 1, 80 do
local Pos = Vector( math.Rand( -1, 1 ), math.Rand( -1, 1 ), 0)
local particle = emitter:Add( smoke[math.random(1, #smoke)], vOffset + Pos * 4 )
if ( particle ) then
particle:SetVelocity( Pos * 320 )
particle:SetLifeTime( 0 )
particle:SetDieTime( 8 )
particle:SetStartAlpha( 8 )
particle:SetEndAlpha( 0 )
particle:SetColor(60, 193, 255)
particle:SetRoll( math.Rand( -1, 1 ) )
local Size = math.random( 100, 150 )
particle:SetStartSize( Size )
particle:SetEndSize( Size )
particle:SetAirResistance( 50 )
particle:SetGravity( Vector( math.Rand( -1, 1 ) * 50, math.Rand( -1, 1 ) * 50, 10 ) )
end
end
timer.Simple(4.2, function()
for i = 0, 80 do
local exp = emitter:Add( smoke[math.random(1, #smoke)], vOffset)
if exp then
exp:SetVelocity( Vector(math.Rand(-1, 1), math.Rand(-1, 1), 0) * 300 )
exp:SetDieTime( 3 )
exp:SetStartAlpha( 68 )
exp:SetStartSize( 150 )
exp:SetEndSize( 80 )
exp:SetEndAlpha( 0 )
exp:SetRoll( math.Rand( -1, 1 ) )
exp:SetColor(60, 193, 255)
exp:SetGravity( Vector( math.Rand( -1, 1 ) * 50, math.Rand( -1, 1 ) * 50, 10 ) )
end
end
emitter:Finish()
end)
end
function EFFECT:Think()
return false
end
function EFFECT:Render()
end

View File

@@ -0,0 +1,83 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local smoke = {
"particle/smokesprites_0001",
"particle/smokesprites_0002",
"particle/smokesprites_0003",
"particle/smokesprites_0004",
"particle/smokesprites_0005",
"particle/smokesprites_0006",
"particle/smokesprites_0007",
"particle/smokesprites_0008",
"particle/smokesprites_0009",
"particle/smokesprites_0010",
"particle/smokesprites_0011",
"particle/smokesprites_0012",
"particle/smokesprites_0013",
"particle/smokesprites_0014",
"particle/smokesprites_0015",
"particle/smokesprites_0016"
}
function EFFECT:Init( data )
local vOffset = data:GetOrigin()
local emitter = ParticleEmitter( vOffset, false )
for i = 0, 15 do
local exp = emitter:Add( "particles/flamelet"..math.random(1,5), vOffset)
if exp then
exp:SetVelocity( VectorRand() * 250 )
exp:SetDieTime( 0.2 )
exp:SetStartAlpha( 255 )
exp:SetStartSize( 20 )
exp:SetEndSize( 150 )
exp:SetEndAlpha( 50 )
exp:SetRoll( math.Rand( -1, 1 ) )
exp:SetColor(60, 193, 255)
exp:SetGravity( Vector( 50, 50, 10 ) )
end
end
for i = 1, 40 do
local Pos = Vector( math.Rand( -1, 1 ), math.Rand( -1, 1 ), 0)
local particle = emitter:Add( smoke[math.random(1, #smoke)], vOffset + Pos * 4 )
if ( particle ) then
particle:SetVelocity( Pos * 120 )
particle:SetLifeTime( 0 )
particle:SetDieTime( 2 )
particle:SetStartAlpha( 8 )
particle:SetEndAlpha( 0 )
particle:SetColor(60, 193, 255)
particle:SetRoll( math.Rand( -1, 1 ) )
local Size = math.random( 100, 150 )
particle:SetStartSize( Size )
particle:SetEndSize( Size )
particle:SetAirResistance( 50 )
particle:SetGravity( Vector( math.Rand( -1, 1 ) * 50, math.Rand( -1, 1 ) * 50, 10 ) )
end
end
emitter:Finish()
end
function EFFECT:Think()
return false
end
function EFFECT:Render()
end

View File

@@ -0,0 +1,82 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local smoke = {
"particle/smokesprites_0001",
"particle/smokesprites_0002",
"particle/smokesprites_0003",
"particle/smokesprites_0004",
"particle/smokesprites_0005",
"particle/smokesprites_0006",
"particle/smokesprites_0007",
"particle/smokesprites_0008",
"particle/smokesprites_0009",
"particle/smokesprites_0010",
"particle/smokesprites_0011",
"particle/smokesprites_0012",
"particle/smokesprites_0013",
"particle/smokesprites_0014",
"particle/smokesprites_0015",
"particle/smokesprites_0016"
}
function EFFECT:Init( data )
local vOffset = data:GetOrigin()
local emitter = ParticleEmitter( vOffset, false )
for i = 0, 80 do
local exp = emitter:Add( "particles/flamelet"..math.random(1,5), vOffset)
if exp then
exp:SetVelocity( Vector( math.Rand( -1, 1 ), math.Rand( -1, 1 ), 0) * 320 )
exp:SetDieTime( 0.8 )
exp:SetStartAlpha( 200 )
exp:SetStartSize( 20 )
exp:SetEndSize( 40 )
exp:SetEndAlpha( 0 )
exp:SetRoll( math.Rand( -1, 1 ) )
exp:SetGravity( Vector( 50, 50, 8 ) )
end
end
for i = 1, 80 do
local Pos = Vector( math.Rand( -1, 1 ), math.Rand( -1, 1 ), 0)
local particle = emitter:Add( smoke[math.random(1, #smoke)], vOffset + Pos * 4 )
if ( particle ) then
particle:SetVelocity( Vector( math.Rand( -1, 1 ), math.Rand( -1, 1 ), 0) * 150 + Vector(0, 0, 8))
particle:SetLifeTime( 0 )
particle:SetDieTime( 4 )
particle:SetStartAlpha( 80 )
particle:SetEndAlpha( 0 )
particle:SetColor(32, 185, 50)
particle:SetRoll( math.Rand( -1, 1 ) )
local Size = math.random( 20, 40 )
particle:SetStartSize( Size )
particle:SetEndSize( Size )
particle:SetAirResistance( 100 )
particle:SetGravity( Vector( math.Rand( -1, 1 ) * 50, math.Rand( -1, 1 ) * 50, 0 ) )
end
end
emitter:Finish()
end
function EFFECT:Think()
return false
end
function EFFECT:Render()
end

View File

@@ -0,0 +1,145 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local ringMats = {
"particle/particle_ring_blur",
"particle/particle_ring_wave_additive",
"particle/particle_ring_wave_addnofog",
"particle/particle_ring_sharp_additive",
"particle/particle_ring_sharp",
"particle/particle_ring_refract_01",
"particle/particle_ring_blur",
"particle/particle_noisesphere"
}
local smoke = {
"particle/smokesprites_0001",
"particle/smokesprites_0002",
"particle/smokesprites_0003",
"particle/smokesprites_0004",
"particle/smokesprites_0005",
"particle/smokesprites_0006",
"particle/smokesprites_0007",
"particle/smokesprites_0008",
"particle/smokesprites_0009",
"particle/smokesprites_0010",
"particle/smokesprites_0011",
"particle/smokesprites_0012",
"particle/smokesprites_0013",
"particle/smokesprites_0014",
"particle/smokesprites_0015",
"particle/smokesprites_0016"
}
function EFFECT:Init( data )
local vOffset = data:GetOrigin()
local NumParticles = 32
local emitter = ParticleEmitter( vOffset, false )
local ringSize = math.random( 80, 90 )
for i = 1, #ringMats do
local ring = emitter:Add(ringMats[i], vOffset + Vector(0, 0, 20))
if (ring) then
ring:SetStartSize( ringSize )
ring:SetEndSize( 0 )
ring:SetLifeTime( 0 )
ring:SetDieTime( 0.5 )
ring:SetStartAlpha( 150 )
ring:SetEndAlpha( 0 )
ring:SetAirResistance( 100 )
ring:SetGravity( Vector( 0, 0, 10 ) )
ring:SetRoll( 90 )
ring:SetColor(32, 185, 50)
end
end
for i = 0, 40 do
local exp = emitter:Add( "particle/particle_glow_03", vOffset + Vector(0, 0, 20) )
if exp then
exp:SetVelocity( Vector( math.Rand( -1, 1 ), math.Rand( -1, 1 ), 0) * 30 )
exp:SetDieTime( 0.5 )
exp:SetStartAlpha( 255 )
exp:SetStartSize( 75 )
exp:SetEndSize( 120 )
exp:SetEndAlpha( 0 )
exp:SetRoll( math.Rand( -1, 1 ) )
exp:SetColor(32, 185, 50)
end
end
for i = 1, 40 do
local Pos = Vector( math.Rand( -1, 1 ), math.Rand( -1, 1 ), 0)
local particle = emitter:Add( smoke[math.random(1, #smoke)], vOffset + Pos * 4 )
if ( particle ) then
particle:SetVelocity( Pos * 30 )
particle:SetLifeTime( 0 )
particle:SetDieTime( 5 )
particle:SetStartAlpha( 8 )
particle:SetEndAlpha( 0 )
particle:SetColor(32, 185, 50)
particle:SetRoll( math.Rand( -1, 1 ) )
local Size = math.random( 100, 150 )
particle:SetStartSize( Size )
particle:SetEndSize( Size )
particle:SetAirResistance( 50 )
particle:SetGravity( Vector( math.Rand( -1, 1 ) * 15, math.Rand( -1, 1 ) * 15, 18 ) )
end
end
for i = 0, NumParticles do
local Pos = Vector( math.Rand( -1, 1 ), math.Rand( -1, 1 ), math.Rand( -1, 1 ) )
local particle = emitter:Add( "particle/particle_ring_wave_8", vOffset + Pos * 4 )
if ( particle ) then
particle:SetVelocity( Pos * 340 )
particle:SetLifeTime( 0 )
particle:SetDieTime( 3 )
particle:SetStartAlpha( 255 )
particle:SetEndAlpha( 0 )
particle:SetColor(32, 185, 50)
local Size = math.random( 5, 15 )
particle:SetStartSize( Size )
particle:SetEndSize( 0 )
particle:SetRoll( math.Rand( 0, 360 ) )
particle:SetRollDelta( math.Rand( -25, 25 ) )
particle:SetAirResistance( 150 )
particle:SetGravity( Vector( math.Rand( -1, 1 ) * 15, math.Rand( -1, 1 ) * 15, 30 ) )
end
end
emitter:Finish()
end
function EFFECT:Think()
return false
end
function EFFECT:Render()
end

View File

@@ -0,0 +1,35 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
include("shared.lua");
function ENT:Think()
local dlight = DynamicLight( self:EntIndex() );
cam.Start3D( EyePos(), EyeAngles() );
for k, v in ipairs( player.GetAll() ) do
if (v:Alive()) then
if ( dlight and v == self.Owner ) then
local lightVector = self:GetPos();
lightVector:Add(Vector(0,2,0));
dlight.Pos = lightVector;
dlight.r = 30;
dlight.g = 255;
dlight.b = 30;
dlight.Brightness = 0;
dlight.Size = 700;
dlight.Decay = 5;
dlight.DieTime = CurTime() + 0.1;
end;
end;
end;
cam.End3D();
end;

View File

@@ -0,0 +1,37 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
include("shared.lua");
AddCSLuaFile("cl_init.lua");
AddCSLuaFile("shared.lua");
function ENT:Initialize()
self:SetMoveType( MOVETYPE_NONE );
self:SetSolid( SOLID_NONE );
self:SetCollisionGroup( COLLISION_GROUP_NONE );
ent:SetModel("models/error.mdl");
ent:SetColor( Color(0,0,0,0) );
ent:DrawShadow(false);
end;
function ENT:SetOwnerVariable(owner)
self.Owner = owner;
end;
function ENT:RemoveLight(owner)
local worldmodel = ents.FindInSphere(owner:GetPos(), 0.6);
for k, v in pairs(worldmodel) do
if (v:GetClass() == "ix_nvlight" and v:GetOwner() == owner) then
v:Remove();
end;
end;
end;

View File

@@ -0,0 +1,17 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
DEFINE_BASECLASS("base_gmodentity");
ENT.Type = "anim";
ENT.Author = "RJ";
ENT.PrintName = "Lumière de vision";
ENT.Spawnable = false;
ENT.AdminSpawnable = false;

View File

@@ -0,0 +1,105 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ENT.Type = "anim"
ENT.PrintName = "Bouclier de Vortigaunt"
ENT.Category = "HL2RP"
ENT.Spawnable = true
ENT.bNoPersist = true
ENT.AutomaticFrameAdvance = true
if (SERVER) then
function ENT:Initialize()
self:SetModel("models/props_phx/construct/metal_dome360.mdl")
self:PhysicsInit(SOLID_VPHYSICS)
local physObj = self:GetPhysicsObject()
if (IsValid(physObj)) then
physObj:Wake()
end
self:SetCollisionGroup(COLLISION_GROUP_DEBRIS_TRIGGER)
self:SetSolid(SOLID_VPHYSICS)
self:AddEffects(EF_NOSHADOW)
self:AddEFlags(EFL_DONTBLOCKLOS)
self:SetRenderMode(RENDERMODE_WORLDGLOW)
self:SetMaterial("models/props_combine/stasisshield_sheet")
self:SetColor(Color(0, 255, 55, 255))
self:SetModelScale(1.2)
self:SetHealth(ix.config.Get("VortShieldHealth", 500))
timer.Simple(0.25, function()
ParticleEffectAttach("vort_shield_parent", PATTACH_ABSORIGIN_FOLLOW, self, 0)
end)
end
function ENT:OnTakeDamage(dmginfo)
self:EmitSound("ambient/energy/ion_cannon_shot"..math.random(1, 3)..".wav")
ParticleEffect("vortigaunt_glow_beam_cp0", dmginfo:GetDamagePosition(), Angle(0, 0, 0), self)
self:SetHealth(math.Clamp(self:Health() - dmginfo:GetDamage(), 0, 350))
if self:Health() <= 0 then
self:Die()
end
end
function ENT:ImpactTrace(trace, dmgtype, customimpactname)
if (trace.HitSky) then
return
end
local effectdata = EffectData()
effectdata:SetOrigin(trace.HitPos + trace.HitNormal)
effectdata:SetNormal(trace.HitNormal)
util.Effect("AR2Impact", effectdata)
return true
end
function ENT:Die()
ParticleEffect("vortigaunt_charge_token", self:GetPos()*15, Angle(0, 0, 0))
self:EmitSound("ambient/levels/labs/electric_explosion1.wav", 80, 100, 1, CHAN_WEAPON)
self:Remove()
end
function ENT:Think()
if (!IsValid(self:GetOwner()) or !self:GetOwner():IsVortigaunt()) then
self:Remove()
end
self:NextThink(CurTime() + 0.1)
return true
end
else
function ENT:Think()
if IsValid(self:GetOwner()) and self:GetOwner():Alive() then
local lightVector = self:GetPos() + self:GetUp()*15
local dlight = DynamicLight(self:EntIndex())
dlight.Pos = lightVector
dlight.r = 30
dlight.g = 255
dlight.b = 30
dlight.Brightness = 0
dlight.Size = 700
dlight.Decay = 5
dlight.DieTime = CurTime() + 0.1
end
end
function ENT:Draw()
self:DrawModel()
self:RemoveAllDecals()
end
end

View File

@@ -0,0 +1,204 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
if (SERVER) then
AddCSLuaFile("shared.lua")
end
if (CLIENT) then
SWEP.Slot = 1
SWEP.SlotPos = 5
SWEP.DrawAmmo = false
SWEP.PrintName = "Lumière"
SWEP.DrawCrosshair = true
end
SWEP.Purpose = "Vous permet de créer une lumière verte autour de votre personnage."
SWEP.Contact = ""
SWEP.Author = "Adolphus"
SWEP.WorldModel = ""
SWEP.HoldType = "fist"
SWEP.Category = "Vort Swep"
SWEP.Primary.DefaultClip = 0
SWEP.Primary.Automatic = false
SWEP.Primary.ClipSize = -1
SWEP.Primary.Ammo = ""
SWEP.Spawnable = true
SWEP.AdminSpawnable = false
SWEP.Secondary.DefaultClip = 0
SWEP.Secondary.Automatic = false
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.Ammo = ""
SWEP.ViewModelFOV = 110
SWEP.ViewModel = Model("models/willardnetworks/c_arms_vortigaunt.mdl")
SWEP.IsAlwaysRaised = true
SWEP.vePerUse = 1
if CLIENT then
SWEP.NextAllowedPlayRateChange = 0
end
function SWEP:Initialize()
end
function SWEP:Deploy()
if (!IsValid(self:GetOwner())) then
return
end
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_DRAW)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
end
if (CLIENT) then
function SWEP:Think()
if (!IsValid(self:GetOwner())) then
return
end
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel) and self.NextAllowedPlayRateChange < CurTime()) then
viewModel:SetPlaybackRate(1)
end
end
end
function SWEP:Holster()
if (!IsValid(self:GetOwner())) then
return
end
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_HOLSTER)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
return true
end
-- A function to set whether the SWEP is activated.
function SWEP:SetActivated(bActivated)
self.Activated = bActivated
end
-- A function to get whether the SWEP is activated.
function SWEP:IsActivated()
return self.Activated
end
-- Called when the player attempts to primary fire.
function SWEP:PrimaryAttack()
if (SERVER) then
local ent = ents.Create("ix_nvlight")
if (!self.Activated) then
local percentage = self.vePerUse / 100
if !self:GetOwner():HasVortalEnergy(self.vePerUse + (percentage * self:GetOwner():Armor())) then
return
end
self:GetOwner():TakeVortalEnergy(self.vePerUse + (percentage * self:GetOwner():Armor()))
self:GetOwner():EmitSound("npc/vort/health_charge.wav")
self.Activated = true
ent:SetOwner(self:GetOwner())
ent:SetParent(self:GetOwner())
ent:SetPos(self:GetOwner():GetPos())
ent:SetOwnerVariable(self:GetOwner())
else
self:GetOwner():EmitSound("npc/vort/health_charge.wav")
self.Activated = false
ent:RemoveLight(self:GetOwner())
end
end
self:SetNextPrimaryFire(CurTime() + 4)
return false
end
function SWEP:OnRemove()
if (CLIENT or !IsValid(self:GetOwner())) then return end
local worldmodel = ents.FindInSphere(self:GetOwner():GetPos(), 1);
for _, v in pairs(worldmodel) do
if (v:GetClass() == "ix_nvlight" and v:GetOwner() == self:GetOwner()) then
v:Remove()
end
end
end
if (CLIENT) then
function SWEP:PreDrawViewModel(viewModel, weapon, client)
local hands = player_manager.TranslatePlayerHands(player_manager.TranslateToPlayerModelName(client:GetModel()))
if (hands and hands.model) then
viewModel:SetModel(hands.model)
viewModel:SetSkin(hands.skin)
viewModel:SetBodyGroups(hands.body)
end
end
function SWEP:DoDrawCrosshair(x, y)
surface.SetDrawColor(255, 255, 255, 66)
surface.DrawRect(x - 2, y - 2, 4, 4)
end
-- Adjust these variables to move the viewmodel's position
SWEP.IronSightsPos = Vector(-5, -5, -55)
SWEP.IronSightsAng = Vector(35, 15, 10)
function SWEP:GetViewModelPosition(EyePos, EyeAng)
local Mul = 1.0
local Offset = self.IronSightsPos
if (self.IronSightsAng) then
EyeAng = EyeAng * 1
EyeAng:RotateAroundAxis(EyeAng:Right(), self.IronSightsAng.x * Mul)
EyeAng:RotateAroundAxis(EyeAng:Up(), self.IronSightsAng.y * Mul)
EyeAng:RotateAroundAxis(EyeAng:Forward(), self.IronSightsAng.z * Mul)
end
local Right = EyeAng:Right()
local Up = EyeAng:Up()
local Forward = EyeAng:Forward()
EyePos = EyePos + Offset.x * Right * Mul
EyePos = EyePos + Offset.y * Forward * Mul
EyePos = EyePos + Offset.z * Up * Mul
return EyePos, EyeAng
end
end
-- Called when the player attempts to secondary fire.
function SWEP:SecondaryAttack() end

View File

@@ -0,0 +1,363 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
if ( SERVER ) then
AddCSLuaFile("shared.lua")
end
if (CLIENT) then
SWEP.Slot = 0
SWEP.SlotPos = 5
SWEP.DrawAmmo = false
SWEP.PrintName = "Vortibeam Advanced"
SWEP.DrawCrosshair = true
game.AddParticles("particles/Vortigaunt_FX.pcf")
end
PrecacheParticleSystem("wn_vortigaunt_beam_colored")
PrecacheParticleSystem("wn_vortigaunt_beam_charge_colored")
PrecacheParticleSystem("wn_vortigaunt_hand_glow_colored")
SWEP.Instructions = "Primary Fire: Fire your beam."
SWEP.Purpose = "Immediately kills the target that you fire it at."
SWEP.Contact = ""
SWEP.Author = "RJ"
SWEP.Category = "Vort Swep"
player_manager.AddValidModel("vortigaunt_arms2", "models/willardnetworks/vortigaunt.mdl")
player_manager.AddValidHands("vortigaunt_arms2", "models/willardnetworks/c_arms_vortigaunt.mdl", 1, "0000000")
SWEP.ViewModel = Model("models/willardnetworks/c_arms_vortigaunt.mdl")
SWEP.ViewModelFOV = 110
SWEP.WorldModel = ""
SWEP.Spawnable = true
SWEP.AdminSpawnable = false
SWEP.Primary.IsAlwaysRaised = true
SWEP.IsAlwaysRaised = true
SWEP.HoldType = "pistol"
SWEP.Primary.DefaultClip = 0
SWEP.Primary.Automatic = false
SWEP.Primary.ClipSize = -1
SWEP.Primary.Damage = 300
SWEP.Primary.Delay = 3
SWEP.Primary.Ammo = ""
SWEP.Secondary.DefaultClip = 0
SWEP.Secondary.Automatic = false
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.Delay = 0
SWEP.Secondary.Ammo = ""
SWEP.vePerShot = 100
SWEP.aoeRadius = 90
if CLIENT then
SWEP.NextAllowedPlayRateChange = 0
end
-- Called when the SWEP is deployed.
function SWEP:Deploy()
self:SendWeaponAnim(ACT_VM_DRAW)
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_DRAW)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
end
-- Called when the SWEP is holstered.
function SWEP:Holster(switchingTo)
self:SendWeaponAnim(ACT_VM_HOLSTER)
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_HOLSTER)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
return true
end
if (CLIENT) then
function SWEP:PreDrawViewModel(viewModel, weapon, client)
local hands = player_manager.TranslatePlayerHands(player_manager.TranslateToPlayerModelName(client:GetModel()))
if (hands and hands.model) then
viewModel:SetModel(hands.model)
viewModel:SetSkin(hands.skin)
viewModel:SetBodyGroups(hands.body)
end
end
function SWEP:DoDrawCrosshair(x, y)
surface.SetDrawColor(255, 255, 255, 66)
surface.DrawRect(x - 2, y - 2, 4, 4)
end
-- Adjust these variables to move the viewmodel's position
SWEP.IronSightsPos = Vector(-5, -5, -55)
SWEP.IronSightsAng = Vector(35, 15, 10)
function SWEP:GetViewModelPosition(EyePos, EyeAng)
local Mul = 1.0
local Offset = self.IronSightsPos
if (self.IronSightsAng) then
EyeAng = EyeAng * 1
EyeAng:RotateAroundAxis(EyeAng:Right(), self.IronSightsAng.x * Mul)
EyeAng:RotateAroundAxis(EyeAng:Up(), self.IronSightsAng.y * Mul)
EyeAng:RotateAroundAxis(EyeAng:Forward(), self.IronSightsAng.z * Mul)
end
local Right = EyeAng:Right()
local Up = EyeAng:Up()
local Forward = EyeAng:Forward()
EyePos = EyePos + Offset.x * Right * Mul
EyePos = EyePos + Offset.y * Forward * Mul
EyePos = EyePos + Offset.z * Up * Mul
return EyePos, EyeAng
end
function SWEP:Think()
if (!IsValid(self:GetOwner())) then
return
end
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel) and self.NextAllowedPlayRateChange < CurTime()) then
viewModel:SetPlaybackRate(1)
end
end
end
function SWEP:OnRemove()
if (SERVER) then
if self:GetOwner() then
if self:GetOwner().DrawViewModel then
self:GetOwner():DrawViewModel(true)
end
end
end
if (self:GetOwner().broomModel) then
if (self:GetOwner().broomModel:IsValid()) then
self:GetOwner().broomModel:Remove()
end
end
return true
end
-- Called when the SWEP is initialized.
function SWEP:Initialize()
self.Primary.Damage = ix.config.Get("advancedBeamDamage", 200)
self:SetWeaponHoldType(self.HoldType)
end
function SWEP:CanPrimaryAttack()
local v = hook.Run("TFA_CanSecondaryAttack", self)
if v ~= nil then
return v
end
if !self:GetOwner():HasVortalEnergy(self.vePerShot) then
return false
end
if (!self:GetOwner():GetCharacter():CanDoAction("vort_beam_shoot")) then
return false
end
if (!self:GetOwner():OnGround()) then
return false
end
return true
end
-- Called when the player attempts to primary fire.
function SWEP:PrimaryAttack()
if (self.bIsFiring or !self:CanPrimaryAttack()) then return end
self:SetNextPrimaryFire(CurTime() + self.Primary.Delay)
self.bIsFiring = true
if (CLIENT) then
-- Adjust these variables to move the viewmodel's position
self.IronSightsPos = Vector(-10, -5, -70)
self.IronSightsAng = Vector(-5, 100, 10)
end
self:GetOwner():SetAnimation( PLAYER_ATTACK1 )
self:SendWeaponAnim( ACT_VM_PRIMARYATTACK )
local chargeSound = CreateSound(self:GetOwner(), "npc/vort/attack_charge.wav")
chargeSound:SetSoundLevel( 60 )
chargeSound:Play()
ParticleEffectAttach("wn_vortigaunt_hand_glow_colored", PATTACH_POINT_FOLLOW, self:GetOwner(), self:GetOwner():LookupAttachment("leftclaw"))
ParticleEffectAttach("wn_vortigaunt_hand_glow_colored", PATTACH_POINT_FOLLOW, self:GetOwner(), self:GetOwner():LookupAttachment("rightclaw"))
util.ScreenShake( self:GetOwner():GetPos(), 8, 15, 1, 1000 )
timer.Simple(0.6, function()
chargeSound:Stop()
if (!IsValid(self)) then return end
if (!IsValid(self:GetOwner())) then
self.bIsFiring = false
return
end
local v = hook.Run("TFA_CanSecondaryAttack", self)
if v ~= nil then
self.bIsFiring = false
return v
end
self:GetOwner():EmitSound("npc/vort/attack_shoot.wav", 40)
local forward = self:GetOwner():EyeAngles():Forward()
local tr = util.QuickTrace(self:GetOwner():EyePos(), (forward + VectorRand(-0.005, 0.005)) * 5000, self:GetOwner())
self:GetOwner():StopParticles()
local leftClaw = self:GetOwner():LookupAttachment("leftclaw")
if (leftClaw) then
util.ParticleTracerEx(
"wn_vortigaunt_beam_colored", self:GetOwner():GetAttachment(leftClaw).Pos, tr.HitPos, true, self:GetOwner():EntIndex(), leftClaw
)
end
local effectdata = EffectData()
effectdata:SetOrigin( tr.HitPos + Vector(0, 0, 50) )
util.Effect( "vortibeam_explosion", effectdata )
if SERVER then
self:GetOwner():TakeVortalEnergy(self.vePerShot)
end
if (SERVER) then
local damage = self:GetOwner():GetCharacter():GetSkillScale("vort_beam") + self.Primary.Damage
local damageInfo = DamageInfo()
if self:GetOwner():GetNetVar("ixVortExtract") then
damage = 999
end
damageInfo:SetAttacker(self:GetOwner())
damageInfo:SetInflictor(self)
damageInfo:SetDamage(damage)
damageInfo:SetDamageForce(forward * damage)
damageInfo:SetReportedPosition(leftClaw and self:GetOwner():GetAttachment(leftClaw).Pos or self:GetOwner():EyePos())
damageInfo:SetDamagePosition(tr.HitPos)
damageInfo:SetDamageType(DMG_SHOCK)
for k, target in pairs(ents.FindInSphere(tr.HitPos, self.aoeRadius)) do
if target != self:GetOwner() and
target:IsPlayer() or
target:IsNextBot() or
target:IsNPC() or
target:IsVehicle() then
if !target:IsLineOfSightClear(tr.HitPos) then
continue
end
if (damageInfo:GetDamage() >= 1) then
target:TakeDamageInfo(damageInfo)
end
if (target:IsPlayer()) then
hook.Run("PostCalculatePlayerDamage", target, damageInfo, HITGROUP_GENERIC)
ix.log.AddRaw("[VORT] ".. self:GetOwner():Name() .." has damaged " .. target:Name() .. " dealing " .. damage .. " with vortadvancedbeam")
ix.chat.Send(self:GetOwner(), "vortbeam", "has damaged " .. target:Name() .. ", dealing " .. damage .. " points of damage", false, attacker)
end
if (target:IsNPC()) then
ix.log.AddRaw("[VORT] ".. self:GetOwner():Name() .." has damaged " .. target:GetClass() .. ", dealing " .. damage .. " with vortadvancedbeam")
end
if (target:IsNPC() or target:IsPlayer()) then
self:GetOwner():GetCharacter():DoAction("vort_beam_shoot")
end
end
end
end
if (CLIENT) then
for k, target in pairs(ents.FindInSphere(tr.HitPos, self.aoeRadius)) do
if target != self:GetOwner() and
target:IsPlayer() or
target:IsNextBot() or
target:IsNPC() or
target:IsVehicle() then
if !target:IsLineOfSightClear(tr.HitPos) then
continue
end
if (target:IsPlayer()) then
--chat.AddText(Color(217, 83, 83), "You have damaged " .. target:Name() .. ", dealing " .. self:GetOwner():GetCharacter():GetSkillScale("vort_beam") + self.Primary.Damage .. " points of damage.")
end
if (target:IsNPC()) then
--chat.AddText(Color(217, 83, 83), "You have damaged " .. target:GetClass() .. ", dealing " .. self:GetOwner():GetCharacter():GetSkillScale("vort_beam") + self.Primary.Damage .. " points of damage.")
end
end
end
end
local viewModel = self:GetOwner():GetViewModel()
timer.Simple(1, function()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_DRAW)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
self.IronSightsPos = Vector(-5, -5, -105)
self.IronSightsAng = Vector(35, 15, 10)
end
end)
timer.Simple(2, function()
-- Adjust these variables to move the viewmodel's position
self.IronSightsPos = Vector(-5, -5, -55)
end)
hook.Run("TFA_PostSecondaryAttack", self)
if (SERVER) then
self:GetOwner():GetCharacter():DoAction("vort_beam_practice")
end
self.bIsFiring = false
end)
hook.Run("TFA_PostSecondaryAttack", self, true)
end
function SWEP:SecondaryAttack()
return false
end

View File

@@ -0,0 +1,373 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
if ( SERVER ) then
AddCSLuaFile("shared.lua")
end
if (CLIENT) then
SWEP.Slot = 0
SWEP.SlotPos = 5
SWEP.DrawAmmo = false
SWEP.PrintName = "Attaque"
SWEP.DrawCrosshair = true
game.AddParticles("particles/Vortigaunt_FX.pcf")
end
PrecacheParticleSystem("vortigaunt_beam")
PrecacheParticleSystem("vortigaunt_beam_b")
PrecacheParticleSystem("vortigaunt_charge_token")
SWEP.Instructions = "Clic GAUCHE : Lance un laser."
SWEP.Purpose = "Tue immédiatement la cible visée."
SWEP.Contact = ""
SWEP.Author = "RJ"
SWEP.Category = "Vort Swep"
player_manager.AddValidModel("vortigaunt_arms2", "models/willardnetworks/vortigaunt.mdl")
player_manager.AddValidHands("vortigaunt_arms2", "models/willardnetworks/c_arms_vortigaunt.mdl", 1, "0000000")
SWEP.ViewModel = Model("models/willardnetworks/c_arms_vortigaunt.mdl")
SWEP.ViewModelFOV = 110
SWEP.WorldModel = ""
SWEP.HoldType = "pistol"
SWEP.Spawnable = true
SWEP.AdminSpawnable = true
SWEP.Primary.IsAlwaysRaised = true
SWEP.IsAlwaysRaised = true
SWEP.Primary.DefaultClip = 0
SWEP.Primary.Automatic = false
SWEP.Primary.ClipSize = -1
SWEP.Primary.Damage = 65
SWEP.Primary.Delay = 3
SWEP.Primary.Ammo = ""
SWEP.Secondary.DefaultClip = 0
SWEP.Secondary.Automatic = false
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.Delay = 0
SWEP.Secondary.Ammo = ""
SWEP.vePerShot = 5
SWEP.aoeRadius = 75
if CLIENT then
SWEP.NextAllowedPlayRateChange = 0
end
-- Called when the SWEP is deployed.
function SWEP:Deploy()
self:SendWeaponAnim(ACT_VM_DRAW)
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_DRAW)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
end
-- Called when the SWEP is holstered.
function SWEP:Holster(switchingTo)
self:SendWeaponAnim(ACT_VM_HOLSTER)
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_HOLSTER)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
return true
end
if (CLIENT) then
function SWEP:PreDrawViewModel(viewModel, weapon, client)
local hands = player_manager.TranslatePlayerHands(player_manager.TranslateToPlayerModelName(client:GetModel()))
if (hands and hands.model) then
viewModel:SetModel(hands.model)
viewModel:SetSkin(hands.skin)
viewModel:SetBodyGroups(hands.body)
end
end
function SWEP:DoDrawCrosshair(x, y)
surface.SetDrawColor(255, 255, 255, 66)
surface.DrawRect(x - 2, y - 2, 4, 4)
end
-- Adjust these variables to move the viewmodel's position
SWEP.IronSightsPos = Vector(-5, -5, -55)
SWEP.IronSightsAng = Vector(35, 15, 10)
function SWEP:GetViewModelPosition(EyePos, EyeAng)
local Mul = 1.0
local Offset = self.IronSightsPos
if (self.IronSightsAng) then
EyeAng = EyeAng * 1
EyeAng:RotateAroundAxis(EyeAng:Right(), self.IronSightsAng.x * Mul)
EyeAng:RotateAroundAxis(EyeAng:Up(), self.IronSightsAng.y * Mul)
EyeAng:RotateAroundAxis(EyeAng:Forward(), self.IronSightsAng.z * Mul)
end
local Right = EyeAng:Right()
local Up = EyeAng:Up()
local Forward = EyeAng:Forward()
EyePos = EyePos + Offset.x * Right * Mul
EyePos = EyePos + Offset.y * Forward * Mul
EyePos = EyePos + Offset.z * Up * Mul
return EyePos, EyeAng
end
if (CLIENT) then
function SWEP:Think()
if (!IsValid(self:GetOwner())) then
return
end
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel) and self.NextAllowedPlayRateChange < CurTime()) then
viewModel:SetPlaybackRate(1)
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
end
end
function SWEP:OnRemove()
if (SERVER) then
if self:GetOwner() then
if self:GetOwner().DrawViewModel then
self:GetOwner():DrawViewModel(true)
end
end
end
if (self:GetOwner().broomModel) then
if (self:GetOwner().broomModel:IsValid()) then
self:GetOwner().broomModel:Remove()
end
end
return true
end
-- Called when the SWEP is initialized.
function SWEP:Initialize()
self.Primary.Damage = ix.config.Get("vortBeamAdditionalDamage", 40)
self:SetWeaponHoldType(self.HoldType)
end
function SWEP:CanPrimaryAttack()
local v = hook.Run("TFA_CanSecondaryAttack", self)
if v ~= nil then
return v
end
local percentage = self.vePerShot / 100
percentage = percentage * ix.config.Get("additionalVortalEnergyDrainPerPointOfArmor", 1)
if !self:GetOwner():HasVortalEnergy(self.vePerShot + (percentage * self:GetOwner():Armor())) then
return false
end
if (!self:GetOwner():GetCharacter():CanDoAction("vort_beam_shoot")) then
return false
end
if (!self:GetOwner():OnGround()) then
return false
end
return true
end
-- Called when the player attempts to primary fire.
function SWEP:PrimaryAttack()
if (self.bIsFiring or !self:CanPrimaryAttack() or self:GetOwner():IsSprinting()) then return end
self:SetNextPrimaryFire(CurTime() + self.Primary.Delay)
self.bIsFiring = true
if (CLIENT) then
-- Adjust these variables to move the viewmodel's position
self.IronSightsPos = Vector(-10, -5, -70)
self.IronSightsAng = Vector(-5, 100, 10)
end
self:SendWeaponAnim( ACT_VM_PRIMARYATTACK )
self:GetOwner():SetAnimation( PLAYER_ATTACK1 )
local chargeSound = CreateSound(self:GetOwner(), "npc/vort/attack_charge.wav")
chargeSound:SetSoundLevel( 60 )
chargeSound:Play()
if (SERVER) then
self:GetOwner():SprintDisable()
end
ParticleEffectAttach("vortigaunt_charge_token", PATTACH_POINT_FOLLOW, self:GetOwner(), self:GetOwner():LookupAttachment("leftclaw"))
ParticleEffectAttach("vortigaunt_charge_token", PATTACH_POINT_FOLLOW, self:GetOwner(), self:GetOwner():LookupAttachment("rightclaw"))
timer.Simple(0.6, function()
chargeSound:Stop()
if (SERVER) then
self:GetOwner():SprintEnable()
end
if (!IsValid(self)) then return end
if (!IsValid(self:GetOwner())) then
self.bIsFiring = false
return
end
local v = hook.Run("TFA_CanSecondaryAttack", self)
if v ~= nil then
self.bIsFiring = false
return v
end
self:GetOwner():EmitSound("npc/vort/attack_shoot.wav", 40)
local forward = self:GetOwner():EyeAngles():Forward()
local tr = util.QuickTrace(self:GetOwner():EyePos(), (forward + VectorRand(-0.005, 0.005)) * 5000, self:GetOwner())
self:GetOwner():StopParticles()
local leftClaw = self:GetOwner():LookupAttachment("leftclaw")
if (leftClaw) then
util.ParticleTracerEx(
"vortigaunt_beam", self:GetOwner():GetAttachment(leftClaw).Pos, tr.HitPos, true, self:GetOwner():EntIndex(), leftClaw
)
end
if SERVER then
local percentage = self.vePerShot / 100
percentage = percentage * ix.config.Get("additionalVortalEnergyDrainPerPointOfArmor", 1)
self:GetOwner():TakeVortalEnergy(self.vePerShot + (percentage * self:GetOwner():Armor()))
end
if (SERVER) then
local damage = self:GetOwner():GetCharacter():GetSkillScale("vort_beam") + self.Primary.Damage
local damageInfo = DamageInfo()
if self:GetOwner():GetNetVar("ixVortExtract") then
damage = 999
end
damageInfo:SetAttacker(self:GetOwner())
damageInfo:SetInflictor(self)
damageInfo:SetDamage(damage)
damageInfo:SetDamageForce(forward * damage)
damageInfo:SetReportedPosition(leftClaw and self:GetOwner():GetAttachment(leftClaw).Pos or self:GetOwner():EyePos())
damageInfo:SetDamagePosition(tr.HitPos)
damageInfo:SetDamageType(DMG_SHOCK)
for k, target in pairs(ents.FindInSphere(tr.HitPos, self.aoeRadius)) do
if target != self:GetOwner() and
target:IsPlayer() or
target:IsNextBot() or
target:IsNPC() or
target:IsVehicle() then
if !target:IsLineOfSightClear(tr.HitPos) then
continue
end
if (damageInfo:GetDamage() >= 1) then
target:TakeDamageInfo(damageInfo)
end
if (target:IsPlayer()) then
hook.Run("PostCalculatePlayerDamage", target, damageInfo, HITGROUP_GENERIC)
ix.log.AddRaw("[VORT] " .. self:GetOwner():Name() .. " has damaged " .. target:Name() .. ", dealing " .. damage .. " with vortbeam")
end
if (target:IsNPC()) then
ix.log.AddRaw("[VORT] " .. self:GetOwner():Name() .. " has damaged " .. target:GetClass() .. ", dealing " .. damage .. " with vortbeam")
end
if (target:IsNPC() or target:IsPlayer()) then
self:GetOwner():GetCharacter():DoAction("vort_beam_shoot")
end
end
end
end
local viewModel = self:GetOwner():GetViewModel()
timer.Simple(1, function()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_DRAW)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
self.IronSightsPos = Vector(-5, -5, -105)
self.IronSightsAng = Vector(35, 15, 10)
end
end)
timer.Simple(2, function()
-- Adjust these variables to move the viewmodel's position
self.IronSightsPos = Vector(-5, -5, -55)
end)
hook.Run("TFA_PostSecondaryAttack", self)
if (SERVER) then
self:GetOwner():GetCharacter():DoAction("vort_beam_practice")
end
if (CLIENT) then
for k, target in pairs(ents.FindInSphere(tr.HitPos, self.aoeRadius)) do
if target != self:GetOwner() and
target:IsPlayer() or
target:IsNextBot() or
target:IsNPC() or
target:IsVehicle() then
if !target:IsLineOfSightClear(tr.HitPos) then
continue
end
if (target:IsPlayer()) then
--chat.AddText(Color(217, 83, 83), "You have damaged " .. target:Name() .. ", dealing " .. self:GetOwner():GetCharacter():GetSkillScale("vort_beam") + self.Primary.Damage .. " points of damage.")
end
if (target:IsNPC()) then
--chat.AddText(Color(217, 83, 83), "You have damaged " .. target:GetClass() .. ", dealing " .. self:GetOwner():GetCharacter():GetSkillScale("vort_beam") + self.Primary.Damage .. " points of damage.")
end
end
end
end
self.bIsFiring = false
end)
hook.Run("TFA_PostSecondaryAttack", self, true)
end
function SWEP:SecondaryAttack()
return false
end

View File

@@ -0,0 +1,295 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
if ( SERVER ) then
AddCSLuaFile( "shared.lua" )
end
if (CLIENT) then
SWEP.Slot = 5
SWEP.SlotPos = 5
SWEP.DrawAmmo = false
SWEP.PrintName = "Soins"
SWEP.DrawCrosshair = true
end
SWEP.Author = "Fruity"
SWEP.Instructions = "Clic GAUCHE : Soigner un individu / Surcharger équipement"
SWEP.Purpose = "Pour guérir les gens ou surcharger les équipements Combine."
SWEP.Contact = ""
SWEP.Primary.IsAlwaysRaised = true
SWEP.IsAlwaysRaised = true
SWEP.Category = "Vort Swep"
SWEP.Slot = 5
SWEP.SlotPos = 5
SWEP.Weight = 5
SWEP.Spawnable = true
SWEP.AdminSpawnable = false
SWEP.ViewModel = Model("models/willardnetworks/c_arms_vortigaunt.mdl")
SWEP.ViewModelFOV = 110
SWEP.WorldModel = ""
SWEP.HoldType = "smg"
if CLIENT then
SWEP.NextAllowedPlayRateChange = 0
end
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = -1
SWEP.Primary.Automatic = false
SWEP.Primary.Ammo = "none"
SWEP.Secondary.ClipSize = 1
SWEP.Secondary.DefaultClip = 1
SWEP.Secondary.Automatic = false
SWEP.Secondary.Ammo = "none"
SWEP.vePerHP = 0.5
function SWEP:Initialize()
self:SetHoldType(self.HoldType)
end
function SWEP:Deploy()
if (!IsValid(self:GetOwner())) then
return
end
if (SERVER) then
if (!self.HealSound) then
self.HealSound = CreateSound( self.Weapon, "npc/vort/health_charge.wav" )
end
end
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_DRAW)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
end
if (CLIENT) then
function SWEP:Think()
if (!IsValid(self:GetOwner())) then
return
end
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel) and self.NextAllowedPlayRateChange < CurTime()) then
viewModel:SetPlaybackRate(1)
end
end
end
function SWEP:Holster()
if (!IsValid(self:GetOwner())) then
return
end
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_HOLSTER)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
return true
end
if (CLIENT) then
function SWEP:PreDrawViewModel(viewModel, weapon, client)
local hands = player_manager.TranslatePlayerHands(player_manager.TranslateToPlayerModelName(client:GetModel()))
if (hands and hands.model) then
viewModel:SetModel(hands.model)
viewModel:SetSkin(hands.skin)
viewModel:SetBodyGroups(hands.body)
end
end
function SWEP:DoDrawCrosshair(x, y)
surface.SetDrawColor(255, 255, 255, 66)
surface.DrawRect(x - 2, y - 2, 4, 4)
end
-- Adjust these variables to move the viewmodel's position
SWEP.IronSightsPos = Vector(-5, -5, -55)
SWEP.IronSightsAng = Vector(35, 15, 10)
function SWEP:GetViewModelPosition(EyePos, EyeAng)
local Mul = 1.0
local Offset = self.IronSightsPos
if (self.IronSightsAng) then
EyeAng = EyeAng * 1
EyeAng:RotateAroundAxis(EyeAng:Right(), self.IronSightsAng.x * Mul)
EyeAng:RotateAroundAxis(EyeAng:Up(), self.IronSightsAng.y * Mul)
EyeAng:RotateAroundAxis(EyeAng:Forward(), self.IronSightsAng.z * Mul)
end
local Right = EyeAng:Right()
local Up = EyeAng:Up()
local Forward = EyeAng:Forward()
EyePos = EyePos + Offset.x * Right * Mul
EyePos = EyePos + Offset.y * Forward * Mul
EyePos = EyePos + Offset.z * Up * Mul
return EyePos, EyeAng
end
end
function SWEP:DispatchEffect(EFFECTSTR)
local pPlayer=self:GetOwner()
if !pPlayer then return end
local view
if CLIENT then view=GetViewEntity() else view=pPlayer:GetViewEntity() end
if ( !pPlayer:IsNPC() and view:IsPlayer() ) then
ParticleEffectAttach( EFFECTSTR, PATTACH_POINT_FOLLOW, pPlayer, pPlayer:LookupAttachment( "leftclaw" ) )
else
ParticleEffectAttach( EFFECTSTR, PATTACH_POINT_FOLLOW, pPlayer, pPlayer:LookupAttachment( "leftclaw" ) )
end
end
function SWEP:PrimaryAttack()
if (!self:GetOwner():Alive()) then return false end
if (!self:GetOwner():GetCharacter():IsVortigaunt()) then return false end
if (!self:GetOwner():GetCharacter():CanDoAction("vort_channel")) then return false end
local eye = self:GetOwner():GetEyeTrace()
if (!eye.Entity:IsPlayer()) and (eye.Entity:GetClass() != "prop_ragdoll" and eye.Entity:GetClass() != "ix_combinelock" and eye.Entity:GetClass() != "ix_combinelock_cmru" and eye.Entity:GetClass() != "ix_combinelock_cwu" and eye.Entity:GetClass() != "ix_combinelock_dob" and eye.Entity:GetClass() != "ix_combinelock_moe") then return end
if (eye.Entity:GetClass() == "prop_ragdoll" and !eye.Entity.ixPlayer) then return end
local target = eye.Entity
if (!IsValid(target)) then
return false
end
if (self:GetOwner():Health() <= 50) then
if (SERVER) then
self:GetOwner():NotifyLocalized("Tu es trop faible pour canaliser ton énergie!")
end
return
end
if (IsValid(target.ixPlayer)) then
target = target.ixPlayer
end
if (target:GetPos():DistToSqr(self:GetOwner():GetShootPos()) > 105 * 105) then return end
if (target:IsPlayer()) then
if (target:Health() >= target:GetMaxHealth()) then
if (SERVER) then
self:GetOwner():NotifyLocalized("La cible est en parfaite santé!")
end
return
end
if (target:GetCharacter() and target:GetCharacter():GetBleedout()) then
if target:GetCharacter().SetBleedout then
target:GetCharacter():SetBleedout(-1)
end
end
end
self:SetNextPrimaryFire( 10 )
self:SendWeaponAnim( ACT_VM_SECONDARYATTACK )
if (CLIENT) then
-- Adjust these variables to move the viewmodel's position
self.IronSightsPos = Vector(0, -5, -55)
self.IronSightsAng = Vector(35, 15, 10)
end
local healAmount = self:GetOwner():GetCharacter():GetSkillScale("vort_heal_amount")
local veToApply = healAmount * self.vePerHP
local percentage = self.vePerHP / 100
percentage = percentage * ix.config.Get("additionalVortalEnergyDrainPerPointOfArmor", 1)
percentage = healAmount * percentage
if !self:GetOwner():HasVortalEnergy(veToApply + (percentage * self:GetOwner():Armor())) then
self:GetOwner():NotifyLocalized("You don't have enough vortal energy!")
return
end
if (SERVER) then
self:GetOwner():ForceSequence("heal_start", function()
self:DispatchEffect("vortigaunt_charge_token")
self:GetOwner():EmitSound( "npc/vort/health_charge.wav", 100, 150, 1, CHAN_AUTO )
self:SendWeaponAnim( ACT_VM_RELOAD )
self:GetOwner():ForceSequence("heal_cycle", function()
if (!self:GetOwner():Alive()) then return end
if (target:GetPos():DistToSqr(self:GetOwner():GetShootPos()) <= 105 * 105) then
if (target:IsPlayer()) then
self:GetOwner():TakeVortalEnergy(veToApply + (percentage * self:GetOwner():Armor()))
target:SetHealth(math.Clamp(target:Health() + healAmount, 0, target:GetMaxHealth()))
ix.log.AddRaw("[VORT] ".. self:GetOwner():Name() .." has healed " .. target:Name())
else
ix.combineNotify:AddNotification("LOG:// Bio-restricteur " .. (target:GetLocked() and "débloqué" or "bloqué") .. " par %ERREUR%", nil, self:GetOwner())
target:SetLocked(!target:GetLocked())
self:GetOwner():GetCharacter():DoAction("vort_channel")
end
else
self:GetOwner():StopSound("npc/vort/health_charge.wav")
end
self:GetOwner():StopParticles()
self:SendWeaponAnim( ACT_VM_PULLBACK )
self:GetOwner():ForceSequence("heal_end", function()
self:SetNextPrimaryFire( 0 )
self:GetOwner():StopSound("npc/vort/health_charge.wav")
self:GetOwner():Freeze(false)
self:GetOwner().lastVortHeal = CurTime() + 30
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_DRAW)
end
end)
end)
end)
self:GetOwner():Freeze(true)
end
if (CLIENT) then
timer.Simple(8, function()
-- Adjust these variables to move the viewmodel's position
self.IronSightsPos = Vector(-5, -5, -55)
self.IronSightsAng = Vector(35, 15, 10)
end)
end
end
function SWEP:SecondaryAttack()
return false
end

View File

@@ -0,0 +1,347 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
if ( SERVER ) then
AddCSLuaFile("shared.lua")
end
if (CLIENT) then
SWEP.Slot = 0
SWEP.SlotPos = 5
SWEP.DrawAmmo = false
SWEP.PrintName = "Vortipyro"
SWEP.DrawCrosshair = true
game.AddParticles("particles/Vortigaunt_FX.pcf")
end
PrecacheParticleSystem("vortigaunt_beam")
PrecacheParticleSystem("vortigaunt_beam_b")
PrecacheParticleSystem("vortigaunt_charge_token")
SWEP.Instructions = "Primary Fire: Let them burn."
SWEP.Purpose = "Immediately kills the target that you fire it at."
SWEP.Contact = ""
SWEP.Author = "RJ"
SWEP.Category = "Vort Swep"
player_manager.AddValidModel("vortigaunt_arms2", "models/willardnetworks/vortigaunt.mdl")
player_manager.AddValidHands("vortigaunt_arms2", "models/willardnetworks/c_arms_vortigaunt.mdl", 1, "0000000")
SWEP.ViewModel = Model("models/willardnetworks/c_arms_vortigaunt.mdl")
SWEP.ViewModelFOV = 110
SWEP.WorldModel = ""
SWEP.HoldType = "pistol"
SWEP.Spawnable = true
SWEP.AdminSpawnable = false
SWEP.Primary.IsAlwaysRaised = true
SWEP.IsAlwaysRaised = true
SWEP.Primary.DefaultClip = 0
SWEP.Primary.Automatic = false
SWEP.Primary.ClipSize = -1
SWEP.Primary.Damage = 15
SWEP.Primary.Delay = 3
SWEP.Primary.Ammo = ""
SWEP.Secondary.DefaultClip = 0
SWEP.Secondary.Automatic = false
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.Delay = 0
SWEP.Secondary.Ammo = ""
SWEP.vePerShot = 40
SWEP.aoeRadius = 320
if CLIENT then
SWEP.NextAllowedPlayRateChange = 0
end
-- Called when the SWEP is deployed.
function SWEP:Deploy()
self:SendWeaponAnim(ACT_VM_DRAW)
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_DRAW)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
end
-- Called when the SWEP is holstered.
function SWEP:Holster(switchingTo)
self:SendWeaponAnim(ACT_VM_HOLSTER)
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_HOLSTER)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
return true
end
if (CLIENT) then
function SWEP:PreDrawViewModel(viewModel, weapon, client)
local hands = player_manager.TranslatePlayerHands(player_manager.TranslateToPlayerModelName(client:GetModel()))
if (hands and hands.model) then
viewModel:SetModel(hands.model)
viewModel:SetSkin(hands.skin)
viewModel:SetBodyGroups(hands.body)
end
end
function SWEP:DoDrawCrosshair(x, y)
surface.SetDrawColor(255, 255, 255, 66)
surface.DrawRect(x - 2, y - 2, 4, 4)
end
-- Adjust these variables to move the viewmodel's position
SWEP.IronSightsPos = Vector(-5, -5, -55)
SWEP.IronSightsAng = Vector(35, 15, 10)
function SWEP:GetViewModelPosition(EyePos, EyeAng)
local Mul = 1.0
local Offset = self.IronSightsPos
if (self.IronSightsAng) then
EyeAng = EyeAng * 1
EyeAng:RotateAroundAxis(EyeAng:Right(), self.IronSightsAng.x * Mul)
EyeAng:RotateAroundAxis(EyeAng:Up(), self.IronSightsAng.y * Mul)
EyeAng:RotateAroundAxis(EyeAng:Forward(), self.IronSightsAng.z * Mul)
end
local Right = EyeAng:Right()
local Up = EyeAng:Up()
local Forward = EyeAng:Forward()
EyePos = EyePos + Offset.x * Right * Mul
EyePos = EyePos + Offset.y * Forward * Mul
EyePos = EyePos + Offset.z * Up * Mul
return EyePos, EyeAng
end
function SWEP:Think()
if (!IsValid(self:GetOwner())) then
return
end
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel) and self.NextAllowedPlayRateChange < CurTime()) then
viewModel:SetPlaybackRate(1)
end
end
end
function SWEP:OnRemove()
if (SERVER) then
if self:GetOwner() then
if self:GetOwner().DrawViewModel then
self:GetOwner():DrawViewModel(true)
end
end
end
if (self:GetOwner().broomModel) then
if (self:GetOwner().broomModel:IsValid()) then
self:GetOwner().broomModel:Remove()
end
end
return true
end
-- Called when the SWEP is initialized.
function SWEP:Initialize()
self:SetWeaponHoldType(self.HoldType)
end
function SWEP:CanPrimaryAttack()
local v = hook.Run("TFA_CanSecondaryAttack", self)
if v ~= nil then
return v
end
local percentage = self.vePerShot / 100
if !self:GetOwner():HasVortalEnergy(self.vePerShot + (percentage * self:GetOwner():Armor())) then
return false
end
if (!self:GetOwner():GetCharacter():CanDoAction("vort_beam_shoot")) then
return false
end
if (!self:GetOwner():OnGround()) then
return false
end
return true
end
-- Called when the player attempts to primary fire.
function SWEP:PrimaryAttack()
self:SetNextPrimaryFire(CurTime() + self.Primary.Delay)
if (self.bIsFiring or !self:CanPrimaryAttack()) then return end
self.bIsFiring = true
ParticleEffectAttach("vort_meditation", PATTACH_ABSORIGIN_FOLLOW, self:GetOwner(), 0)
ParticleEffectAttach("vort_shield_parent", PATTACH_ABSORIGIN_FOLLOW, self:GetOwner(), 0)
if SERVER then
local owner = self:GetOwner()
owner:SetVelocity(-owner:GetVelocity())
owner:SetRunSpeed(1)
owner:SetWalkSpeed(1)
owner:SetJumpPower(1)
timer.Simple(0.1, function()
if !IsValid(owner) then return end
owner:ForceSequence("Stomp", function()
owner:SetRunSpeed(ix.config.Get("runSpeed") * 1.25)
owner:SetWalkSpeed(ix.config.Get("walkSpeed"))
owner:SetJumpPower(250)
end, nil, true)
end)
end
timer.Simple(0.2, function()
if !IsValid(self:GetOwner()) then return end
ParticleEffectAttach("vortigaunt_charge_token", PATTACH_POINT_FOLLOW, self:GetOwner(), 12)
end)
local chargeSound = CreateSound(self:GetOwner(), "npc/vort/attack_charge.wav")
chargeSound:SetSoundLevel( 90 )
chargeSound:Play()
timer.Simple(1, function()
chargeSound:Stop()
if (!IsValid(self)) then return end
if (!IsValid(self:GetOwner()) or !self:GetOwner():Alive()) then
self.bIsFiring = false
return
end
local v = hook.Run("TFA_CanSecondaryAttack", self)
if v ~= nil then
self.bIsFiring = false
return v
end
local effectdata = EffectData()
effectdata:SetOrigin( self:GetOwner():GetPos() )
util.Effect( "vortipyro_explosion", effectdata )
self:GetOwner():EmitSound("npc/vort/attack_shoot.wav", 40, 90)
local forward = self:GetOwner():EyeAngles():Forward()
self:GetOwner():StopParticles()
if SERVER then
local percentage = self.vePerShot / 100
percentage = percentage * ix.config.Get("additionalVortalEnergyDrainPerPointOfArmor", 1)
self:GetOwner():TakeVortalEnergy(self.vePerShot + (percentage * self:GetOwner():Armor()))
end
if (SERVER) then
local damage = self.Primary.Damage
local damageInfo = DamageInfo()
damageInfo:SetAttacker(self:GetOwner())
damageInfo:SetInflictor(self)
damageInfo:SetDamage(damage)
damageInfo:SetDamageForce(forward * damage)
damageInfo:SetReportedPosition(self:GetOwner():GetPos())
damageInfo:SetDamagePosition(self:GetOwner():GetPos())
damageInfo:SetDamageType(DMG_BURN)
for k, target in pairs(ents.FindInSphere(self:GetOwner():GetPos(), self.aoeRadius)) do
if target != self:GetOwner() and
target:IsPlayer() or
target:IsNextBot() or
target:IsNPC() or
target:IsVehicle() then
if !self:GetOwner():IsLineOfSightClear(target) then
continue
end
target:Ignite(12)
if (damageInfo:GetDamage() >= 1) then
target:TakeDamageInfo(damageInfo)
end
if (target:IsPlayer()) then
hook.Run("PostCalculatePlayerDamage", target, damageInfo, HITGROUP_GENERIC)
ix.log.AddRaw("[VORT] ".. self:GetOwner():Name() .." has damaged " .. target:Name() .. " dealing " .. damage .. " with vortpyro")
ix.chat.Send(self:GetOwner(), "vortbeam", "has damaged " .. target:Name() .. ", dealing " .. damage .. " points of damage", false, attacker)
end
if (target:IsNPC()) then
ix.log.AddRaw("[VORT] ".. self:GetOwner():Name() .." has damaged " .. target:GetClass() .. ", dealing " .. damage .. " with vortpyro")
end
if (target:IsNPC() or target:IsPlayer()) then
self:GetOwner():GetCharacter():DoAction("vort_beam_shoot")
end
end
end
end
if (CLIENT) then
for k, target in pairs(ents.FindInSphere(self:GetOwner():GetPos(), self.aoeRadius)) do
if target != self:GetOwner() and
target:IsPlayer() or
target:IsNextBot() or
target:IsNPC() or
target:IsVehicle() then
if !self:GetOwner():IsLineOfSightClear(target) then
continue
end
if (target:IsPlayer()) then
--chat.AddText(Color(217, 83, 83), "You have damaged " .. target:Name() .. ", dealing " .. self.Primary.Damage .. " points of damage.")
end
if (target:IsNPC()) then
--chat.AddText(Color(217, 83, 83), "You have damaged " .. target:GetClass() .. ", dealing " .. self.Primary.Damage .. " points of damage.")
end
end
end
end
hook.Run("TFA_PostSecondaryAttack", self)
if (SERVER) then
self:GetOwner():GetCharacter():DoAction("vort_beam_practice")
end
self.bIsFiring = false
end)
hook.Run("TFA_PostSecondaryAttack", self, true)
end
function SWEP:SecondaryAttack()
return false
end

View File

@@ -0,0 +1,346 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
if ( SERVER ) then
AddCSLuaFile("shared.lua")
end
if (CLIENT) then
SWEP.Slot = 0
SWEP.SlotPos = 5
SWEP.DrawAmmo = false
SWEP.PrintName = "Vortislam"
SWEP.DrawCrosshair = true
game.AddParticles("particles/Vortigaunt_FX.pcf")
end
PrecacheParticleSystem("vortigaunt_beam")
PrecacheParticleSystem("vortigaunt_beam_b")
PrecacheParticleSystem("vortigaunt_charge_token")
SWEP.Instructions = "Primary Fire: Breaks the surface."
SWEP.Purpose = "Immediately kills the target that you fire it at."
SWEP.Contact = ""
SWEP.Author = "RJ"
SWEP.Category = "Vort Swep"
player_manager.AddValidModel("vortigaunt_arms2", "models/willardnetworks/vortigaunt.mdl")
player_manager.AddValidHands("vortigaunt_arms2", "models/willardnetworks/c_arms_vortigaunt.mdl", 1, "0000000")
SWEP.ViewModel = Model("models/willardnetworks/c_arms_vortigaunt.mdl")
SWEP.ViewModelFOV = 110
SWEP.WorldModel = ""
SWEP.HoldType = "pistol"
SWEP.Spawnable = true
SWEP.AdminSpawnable = false
SWEP.Primary.IsAlwaysRaised = true
SWEP.IsAlwaysRaised = true
SWEP.Primary.DefaultClip = 0
SWEP.Primary.Automatic = false
SWEP.Primary.ClipSize = -1
SWEP.Primary.Damage = 40
SWEP.Primary.Delay = 3
SWEP.Primary.Ammo = ""
SWEP.Secondary.DefaultClip = 0
SWEP.Secondary.Automatic = false
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.Delay = 0
SWEP.Secondary.Ammo = ""
SWEP.vePerShot = 10
SWEP.aoeRadius = 350
if CLIENT then
SWEP.NextAllowedPlayRateChange = 0
end
-- Called when the SWEP is deployed.
function SWEP:Deploy()
self:SendWeaponAnim(ACT_VM_DRAW)
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_DRAW)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
end
-- Called when the SWEP is holstered.
function SWEP:Holster(switchingTo)
self:SendWeaponAnim(ACT_VM_HOLSTER)
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_HOLSTER)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
return true
end
if (CLIENT) then
function SWEP:PreDrawViewModel(viewModel, weapon, client)
local hands = player_manager.TranslatePlayerHands(player_manager.TranslateToPlayerModelName(client:GetModel()))
if (hands and hands.model) then
viewModel:SetModel(hands.model)
viewModel:SetSkin(hands.skin)
viewModel:SetBodyGroups(hands.body)
end
end
function SWEP:DoDrawCrosshair(x, y)
surface.SetDrawColor(255, 255, 255, 66)
surface.DrawRect(x - 2, y - 2, 4, 4)
end
-- Adjust these variables to move the viewmodel's position
SWEP.IronSightsPos = Vector(-5, -5, -55)
SWEP.IronSightsAng = Vector(35, 15, 10)
function SWEP:GetViewModelPosition(EyePos, EyeAng)
local Mul = 1.0
local Offset = self.IronSightsPos
if (self.IronSightsAng) then
EyeAng = EyeAng * 1
EyeAng:RotateAroundAxis(EyeAng:Right(), self.IronSightsAng.x * Mul)
EyeAng:RotateAroundAxis(EyeAng:Up(), self.IronSightsAng.y * Mul)
EyeAng:RotateAroundAxis(EyeAng:Forward(), self.IronSightsAng.z * Mul)
end
local Right = EyeAng:Right()
local Up = EyeAng:Up()
local Forward = EyeAng:Forward()
EyePos = EyePos + Offset.x * Right * Mul
EyePos = EyePos + Offset.y * Forward * Mul
EyePos = EyePos + Offset.z * Up * Mul
return EyePos, EyeAng
end
function SWEP:Think()
if (!IsValid(self:GetOwner())) then
return
end
local viewModel = self:GetOwner():GetViewModel()
if (IsValid(viewModel) and self.NextAllowedPlayRateChange < CurTime()) then
viewModel:SetPlaybackRate(1)
end
end
end
function SWEP:OnRemove()
if (SERVER) then
if self:GetOwner() then
if self:GetOwner().DrawViewModel then
self:GetOwner():DrawViewModel(true)
end
end
end
if (self:GetOwner().broomModel) then
if (self:GetOwner().broomModel:IsValid()) then
self:GetOwner().broomModel:Remove()
end
end
return true
end
-- Called when the SWEP is initialized.
function SWEP:Initialize()
self.Primary.Damage = ix.config.Get("vortSlamBaseDamage", 40)
self:SetWeaponHoldType(self.HoldType)
end
function SWEP:CanPrimaryAttack()
local v = hook.Run("TFA_CanSecondaryAttack", self)
if v ~= nil then
return v
end
local percentage = self.vePerShot / 100
percentage = percentage * ix.config.Get("additionalVortalEnergyDrainPerPointOfArmor", 1)
if !self:GetOwner():HasVortalEnergy(self.vePerShot + (percentage * self:GetOwner():Armor())) then
return false
end
if (!self:GetOwner():GetCharacter():CanDoAction("vort_beam_shoot")) then
return false
end
if (!self:GetOwner():OnGround()) then
return false
end
return true
end
-- Called when the player attempts to primary fire.
function SWEP:PrimaryAttack()
self:SetNextPrimaryFire(CurTime() + self.Primary.Delay)
if (self.bIsFiring or !self:CanPrimaryAttack()) then return end
self.bIsFiring = true
ParticleEffectAttach("vortigaunt_charge_token", PATTACH_POINT_FOLLOW, self:GetOwner(), self:GetOwner():LookupAttachment("leftclaw"))
ParticleEffectAttach("vortigaunt_charge_token", PATTACH_POINT_FOLLOW, self:GetOwner(), self:GetOwner():LookupAttachment("rightclaw"))
ParticleEffectAttach("vort_meditation", PATTACH_ABSORIGIN_FOLLOW, self:GetOwner(), 0)
ParticleEffectAttach("vort_shield_parent", PATTACH_ABSORIGIN_FOLLOW, self:GetOwner(), 0)
if SERVER then
local owner = self:GetOwner()
owner:SetVelocity(-owner:GetVelocity())
owner:SetRunSpeed(1)
owner:SetWalkSpeed(1)
owner:SetJumpPower(1)
timer.Simple(0.1, function()
if !IsValid(owner) then return end
owner:ForceSequence("Dispel", function()
owner:SetRunSpeed(ix.config.Get("runSpeed") * 1.25)
owner:SetWalkSpeed(ix.config.Get("walkSpeed"))
owner:SetJumpPower(250)
end, nil, true)
end)
end
timer.Simple(0.5, function()
if !IsValid(self) or !IsValid(self:GetOwner()) then return end
self:GetOwner():EmitSound("wn/vortigaunts/vort_dispell.wav", 95)
end)
timer.Simple(2, function()
if (!IsValid(self)) then return end
if (!IsValid(self:GetOwner()) or !self:GetOwner():Alive()) then
self.bIsFiring = false
return
end
local v = hook.Run("TFA_CanSecondaryAttack", self)
if v ~= nil then
self.bIsFiring = false
return v
end
local effectdata = EffectData()
effectdata:SetOrigin( self:GetOwner():GetPos() )
util.Effect( "vortislam_impact", effectdata )
local forward = self:GetOwner():EyeAngles():Forward()
self:GetOwner():StopParticles()
if SERVER then
local percentage = self.vePerShot / 100
percentage = percentage * ix.config.Get("additionalVortalEnergyDrainPerPointOfArmor", 1)
self:GetOwner():TakeVortalEnergy(self.vePerShot + (percentage * self:GetOwner():Armor()))
end
if (SERVER) then
local damage = self.Primary.Damage
if self:GetOwner():GetNetVar("ixVortExtract") then
damage = 999
end
local damageInfo = DamageInfo()
damageInfo:SetAttacker(self:GetOwner())
damageInfo:SetInflictor(self)
damageInfo:SetDamage(damage)
damageInfo:SetDamageForce(forward * damage)
damageInfo:SetReportedPosition(self:GetOwner():GetPos())
damageInfo:SetDamagePosition(self:GetOwner():GetPos())
damageInfo:SetDamageType(DMG_SHOCK)
for k, target in pairs(ents.FindInSphere(self:GetOwner():GetPos(), self.aoeRadius)) do
if target != self:GetOwner() and
target:IsPlayer() or
target:IsNextBot() or
target:IsNPC() or
target:IsVehicle() then
if !self:GetOwner():IsLineOfSightClear(target) then
continue
end
if (damageInfo:GetDamage() >= 1) then
target:TakeDamageInfo(damageInfo)
end
if (target:IsPlayer()) then
hook.Run("PostCalculatePlayerDamage", target, damageInfo, HITGROUP_GENERIC)
ix.log.AddRaw("[VORT] ".. self:GetOwner():Name() .." has damaged " .. target:Name() .. " dealing " .. damage .. " with vortslam")
end
if (target:IsNPC()) then
ix.log.AddRaw("[VORT] ".. self:GetOwner():Name() .." has damaged " .. target:GetClass() .. ", dealing " .. damage .. " with vortslam")
end
if (target:IsNPC() or target:IsPlayer()) then
self:GetOwner():GetCharacter():DoAction("vort_beam_shoot")
end
end
end
end
if (CLIENT) then
for k, target in pairs(ents.FindInSphere(self:GetOwner():GetPos(), self.aoeRadius)) do
if target != self:GetOwner() and
target:IsPlayer() or
target:IsNextBot() or
target:IsNPC() or
target:IsVehicle() then
if !self:GetOwner():IsLineOfSightClear(target) then
continue
end
if (target:IsPlayer()) then
--chat.AddText(Color(217, 83, 83), "You have damaged " .. target:Name() .. ", dealing " .. self.Primary.Damage .. " points of damage.")
end
if (target:IsNPC()) then
--chat.AddText(Color(217, 83, 83), "You have damaged " .. target:GetClass() .. ", dealing " .. self.Primary.Damage .. " points of damage.")
end
end
end
end
hook.Run("TFA_PostSecondaryAttack", self)
if (SERVER) then
self:GetOwner():GetCharacter():DoAction("vort_beam_practice")
end
self.bIsFiring = false
end)
hook.Run("TFA_PostSecondaryAttack", self, true)
end
function SWEP:SecondaryAttack()
return false
end

View File

@@ -0,0 +1,207 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
if ( SERVER ) then
AddCSLuaFile( "shared.lua" )
end
if (CLIENT) then
SWEP.Slot = 3
SWEP.SlotPos = 5
SWEP.DrawAmmo = false
SWEP.PrintName = "Balais"
SWEP.DrawCrosshair = true
end
SWEP.Author = "JohnyReaper"
SWEP.Instructions = "Clic GAUCHE : Balayer"
SWEP.Purpose = "Balayer la saleté et les ordures."
SWEP.Contact = ""
SWEP.Category = "Vort Swep"
SWEP.Slot = 3
SWEP.SlotPos = 5
SWEP.Weight = 5
SWEP.IsAlwaysRaised = true
SWEP.Spawnable = true
SWEP.AdminSpawnable = false
SWEP.HoldType = "shotgun"
SWEP.WorldModel = ""
SWEP.ViewModel = Model("models/willardnetworks/c_arms_vortigaunt.mdl")
SWEP.ViewModelFOV = 110
if CLIENT then
SWEP.NextAllowedPlayRateChange = 0
end
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = -1
SWEP.Primary.Automatic = false
SWEP.Primary.Ammo = "none"
SWEP.Secondary.ClipSize = 1
SWEP.Secondary.DefaultClip = 1
SWEP.Secondary.Automatic = false
SWEP.Secondary.Ammo = "none"
function SWEP:Initialize()
self:SetHoldType(self.HoldType)
end
function SWEP:Deploy()
if (!IsValid(self.Owner)) then
return
end
if (SERVER) then
if (!self.Owner:Alive()) then return false end
if (!self.Owner:GetCharacter():IsVortigaunt()) then return false end
self.Owner.broomModel = ents.Create("prop_dynamic")
self.Owner.broomModel:SetModel("models/props_c17/pushbroom.mdl")
self.Owner.broomModel:SetMoveType(MOVETYPE_NONE)
self.Owner.broomModel:SetSolid(SOLID_NONE)
self.Owner.broomModel:SetParent(self.Owner)
self.Owner.broomModel:DrawShadow(true)
self.Owner.broomModel:Spawn()
self.Owner.broomModel:Fire("setparentattachment", "cleaver_attachment", 0.01)
end
local viewModel = self.Owner:GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_DRAW)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
end
function SWEP:Holster()
if (!IsValid(self.Owner)) then
return
end
if (self.Owner.broomModel) then
if (self.Owner.broomModel:IsValid()) then
self.Owner.broomModel:Remove()
end
end
local viewModel = self.Owner:GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_HOLSTER)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
return true
end
if (CLIENT) then
function SWEP:PreDrawViewModel(viewModel, weapon, client)
local hands = player_manager.TranslatePlayerHands(player_manager.TranslateToPlayerModelName(client:GetModel()))
if (hands and hands.model) then
viewModel:SetModel(hands.model)
viewModel:SetSkin(hands.skin)
viewModel:SetBodyGroups(hands.body)
end
end
function SWEP:DoDrawCrosshair(x, y)
surface.SetDrawColor(255, 255, 255, 66)
surface.DrawRect(x - 2, y - 2, 4, 4)
end
-- Adjust these variables to move the viewmodel's position
SWEP.IronSightsPos = Vector(-5, -5, -55)
SWEP.IronSightsAng = Vector(35, 15, 10)
function SWEP:GetViewModelPosition(EyePos, EyeAng)
local Mul = 1.0
local Offset = self.IronSightsPos
if (self.IronSightsAng) then
EyeAng = EyeAng * 1
EyeAng:RotateAroundAxis(EyeAng:Right(), self.IronSightsAng.x * Mul)
EyeAng:RotateAroundAxis(EyeAng:Up(), self.IronSightsAng.y * Mul)
EyeAng:RotateAroundAxis(EyeAng:Forward(), self.IronSightsAng.z * Mul)
end
local Right = EyeAng:Right()
local Up = EyeAng:Up()
local Forward = EyeAng:Forward()
EyePos = EyePos + Offset.x * Right * Mul
EyePos = EyePos + Offset.y * Forward * Mul
EyePos = EyePos + Offset.z * Up * Mul
return EyePos, EyeAng
end
end
if (CLIENT) then
function SWEP:Think()
if (!IsValid(self.Owner)) then
return
end
local viewModel = self.Owner:GetViewModel()
if (IsValid(viewModel) and self.NextAllowedPlayRateChange < CurTime()) then
viewModel:SetPlaybackRate(1)
end
end
end
function SWEP:OnRemove()
if (SERVER) then
if self.Owner then
if self.Owner.DrawViewModel then
self.Owner:DrawViewModel(true)
end
end
end
if (self.Owner.broomModel) then
if (self.Owner.broomModel:IsValid()) then
self.Owner.broomModel:Remove()
end
end
return true
end
function SWEP:PrimaryAttack()
if (!self.Owner:Alive()) then return false end
if (!self.Owner:GetCharacter():IsVortigaunt()) then return false end
self:SetNextPrimaryFire( CurTime() + 2 )
-- self.Owner:SetAnimation( PLAYER_ATTACK1 )
if (SERVER) then
self.Owner:ForceSequence("sweep", nil,nil, false)
end
end
function SWEP:SecondaryAttack()
return false
end

View File

@@ -0,0 +1,208 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
if (SERVER) then
AddCSLuaFile("shared.lua")
end
if (CLIENT) then
SWEP.Slot = 1
SWEP.SlotPos = 5
SWEP.DrawAmmo = false
SWEP.PrintName = "Bouclier"
SWEP.DrawCrosshair = true
end
SWEP.Purpose = "Permet de créer un bouclier."
SWEP.Contact = ""
SWEP.Author = "Adolphus (& M!NT)"
SWEP.WorldModel = ""
SWEP.HoldType = "fist"
SWEP.Category = "Vort Swep"
SWEP.Primary.DefaultClip = 0
SWEP.Primary.Automatic = false
SWEP.Primary.ClipSize = -1
SWEP.Primary.Ammo = ""
SWEP.Spawnable = true
SWEP.AdminSpawnable = false
SWEP.Secondary.DefaultClip = 0
SWEP.Secondary.Automatic = false
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.Ammo = ""
SWEP.ViewModelFOV = 110
SWEP.ViewModel = Model("models/willardnetworks/c_arms_vortigaunt.mdl")
SWEP.IsAlwaysRaised = true
SWEP.vePerUse = 50
if CLIENT then
SWEP.NextAllowedPlayRateChange = 0
end
function SWEP:Initialize()
return
end
function SWEP:Deploy()
local owner = self:GetOwner()
if (!IsValid(owner)) then
return
end
local viewModel = owner:GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_DRAW)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
end
if (CLIENT) then
function SWEP:Think()
local owner = self:GetOwner()
if (self.vSHIELD and !IsValid(owner)) then
self.vSHIELD:Remove()
return
end
local viewModel = owner:GetViewModel()
if (IsValid(viewModel) and self.NextAllowedPlayRateChange < CurTime()) then
viewModel:SetPlaybackRate(1)
end
end
end
function SWEP:Holster()
local owner = self:GetOwner()
if (!IsValid(owner)) then
return
end
local viewModel = owner:GetViewModel()
if (IsValid(viewModel)) then
viewModel:SetPlaybackRate(1)
viewModel:ResetSequence(ACT_VM_FISTS_HOLSTER)
if CLIENT then
self.NextAllowedPlayRateChange = CurTime() + viewModel:SequenceDuration()
end
end
return true
end
function SWEP:ValidateShield()
for _, shield in ipairs(ents.FindByClass("ix_vortshield")) do
if shield:GetOwner() == self:GetOwner() then
shield:Remove()
end
end
end
-- Called when the player attempts to primary fire.
function SWEP:PrimaryAttack()
local owner = self:GetOwner()
if (!owner:GetCharacter():HasFlags("q")) then
if CLIENT then
owner:NotifyLocalized("Vous navez pas le flag (q) requis!")
end
return
end
local percentage = self.vePerUse / 100
percentage = percentage * ix.config.Get("additionalVortalEnergyDrainPerPointOfArmor", 1)
if !self.Owner:HasVortalEnergy(self.vePerUse + (percentage * self.Owner:Armor())) then
return
end
if (SERVER) then
if (!IsValid(self.vSHIELD)) then
self:SetNextPrimaryFire(CurTime() + ix.config.Get("VortShieldRecharge", 20))
self.Owner:TakeVortalEnergy(self.vePerUse + (percentage * self.Owner:Armor()))
self:ValidateShield()
self.vSHIELD = ents.Create("ix_vortshield")
self.vSHIELD:SetPos(owner:GetPos() + owner:GetUp()*45)
self.vSHIELD:Spawn()
self.vSHIELD:Activate()
self.vSHIELD:SetOwner(owner)
self.vSHIELD:FollowBone(owner, 11)
self.vSHIELD:SetLocalAngles(Angle(0, 0, -90))
self.vSHIELD:SetLocalPos(Vector(-20, 10, 0))
owner:EmitSound("npc/vort/health_charge.wav")
end
end
return false
end
function SWEP:SecondaryAttack()
if (SERVER) then
if IsValid(self.vSHIELD) then
self:GetOwner():EmitSound("npc/vort/health_charge.wav")
self.vSHIELD:Remove()
end
self:SetNextSecondaryFire(CurTime() + 4)
end
return false
end
if (CLIENT) then
function SWEP:PreDrawViewModel(viewModel, weapon, client)
local hands = player_manager.TranslatePlayerHands(player_manager.TranslateToPlayerModelName(client:GetModel()))
if (hands and hands.model) then
viewModel:SetModel(hands.model)
viewModel:SetSkin(hands.skin)
viewModel:SetBodyGroups(hands.body)
end
end
function SWEP:DoDrawCrosshair(x, y)
surface.SetDrawColor(255, 255, 255, 66)
surface.DrawRect(x - 2, y - 2, 4, 4)
end
-- Adjust these variables to move the viewmodel's position
SWEP.IronSightsPos = Vector(-5, -5, -55)
SWEP.IronSightsAng = Vector(35, 15, 10)
function SWEP:GetViewModelPosition(EyePos, EyeAng)
local Mul = 1.0
local Offset = self.IronSightsPos
if (self.IronSightsAng) then
EyeAng = EyeAng * 1
EyeAng:RotateAroundAxis(EyeAng:Right(), self.IronSightsAng.x * Mul)
EyeAng:RotateAroundAxis(EyeAng:Up(), self.IronSightsAng.y * Mul)
EyeAng:RotateAroundAxis(EyeAng:Forward(), self.IronSightsAng.z * Mul)
end
local Right = EyeAng:Right()
local Up = EyeAng:Up()
local Forward = EyeAng:Forward()
EyePos = EyePos + Offset.x * Right * Mul
EyePos = EyePos + Offset.y * Forward * Mul
EyePos = EyePos + Offset.z * Up * Mul
return EyePos, EyeAng
end
end

View File

@@ -0,0 +1,26 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Vortigaunt Bandages"
ITEM.description = "Wounded or otherwise, these bandages will serve its purpose."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/vort_clothingitems/vort_bandage.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Legs"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["hooks"] = 2 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}
ITEM.colorAppendix = {
blue = "Fits on the shackles slot",
}

View File

@@ -0,0 +1,26 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Bandana vortiguant"
ITEM.description = "La discrétion est de la plus haute importance. Je ne voudrais pas que quiconque sache qu'un Vortigaunt était ici."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/head_facewrap.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.iconCam = {
pos = Vector(-0.76, -0.13, 200),
ang = Angle(90.05, 189.72, 0),
fov = 2.5
}
ITEM.outfitCategory = "Glasses"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["face"] = 1 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,26 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Vortigaunt Belt"
ITEM.description = "A belt made for human use, but a curious vortigaunt might try it on."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/vort_clothingitems/vort_belt.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Hands"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["meat"] = 3 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}
ITEM.colorAppendix = {
blue = "Fits on the meat belt slot",
}

View File

@@ -0,0 +1,27 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Vortigaunt Boonie"
ITEM.description = "A wide rimmed hat. Keeps the sun off your vort head."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/head_boonie.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.iconCam = {
ang = Angle(25.370000839233,399.98999023438,0),
pos = Vector(-138.86999511719,-116.79000091553,85.76000213623),
fov = 3.82,
}
ITEM.outfitCategory = "Head"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["head"] = 6 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,27 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Toque de vortigaunt"
ITEM.description = "Les Vortigaunts sont bien connus pour leurs capacités dans les arts culinaires en raison de leur lien avec la Vortessence. La seule étape restante pour qu'un Vortigaunt agisse temporairement comme un chef expert est de porter l'un de ces chapeaux idiots."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/head_chefhat.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.iconCam = {
pos = Vector(-138.87, -116.79, 85.76),
ang = Angle(25.28, 400.12, 0),
fov = 4.26
}
ITEM.outfitCategory = "Head"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["head"] = 1 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,26 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Vortigaunt Fedora"
ITEM.description = "A rare stylish hat reminiscent of bygone times, certainly no alive creature would expect to see a vortigaunt with one of these.."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/fedora_item.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Head"
ITEM.factionList = {FACTION_VORT}
ITEM.iconCam = {
ang = Angle(25,220.0299987793,0),
pos = Vector(509.64001464844,427.60998535156,310.23999023438),
fov = 1.06,
}
ITEM.bodyGroups = {
["head"] = 5 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,22 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Vortigaunt Flat Cap"
ITEM.description = "A stylish old-school cap that is flat on the head.. Some vorts have particular taste."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/head_hat2.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Head"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["head"] = 4 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,22 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Vortigaunt Construction Hat"
ITEM.description = "Brandished with the Combine mark its back, these construction hats are often worn by the Civil Workers Union."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/workercap_item.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Head"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["head"] = 3 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,27 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Casque vortiguant"
ITEM.description = "La protection avant l'aspect pratique. Avec un peu de chance, l'ennemi peut essayer de viser un peu plus haut."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/head_helmet.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.iconCam = {
pos = Vector(-117.67, -98.6, 71.58),
ang = Angle(25, 400, 0),
fov = 4.42
}
ITEM.outfitCategory = "Head"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["head"] = 2 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,22 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Ceinture de fortune"
ITEM.description = "Une collection de peaux de crabe de tête délicieuses et appétissantes, rassemblées de tous les coins."
ITEM.category = "Vortigaunt"
ITEM.model = "models/n7/vorti_outfit/meat01.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Hands"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["meat"] = 1 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,22 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Ceinture des terres lointaines"
ITEM.description = "Difficile à trouver sous le contrôle du cartel, cette ceinture semble être ornée de viande des terres lointaines."
ITEM.category = "Vortigaunt"
ITEM.model = "models/n7/vorti_outfit/meat02.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Hands"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["meat"] = 2 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,166 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Collier vortiguant"
ITEM.description = "Un collier lourd et métallique avec une technologie extraterrestre à l'intérieur. Neutralise complètement la capacité d'un vortigaunt à manipuler les énergies qui l'entourent. Une fois usé, il ne peut pas être retiré sans les outils appropriés."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/vortigaunt_collar.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Face"
ITEM.factionList = {FACTION_VORT}
ITEM.KeepOnDeath = true
ITEM.bodyGroups = {
["collar"] = 1 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}
function ITEM:GetColorAppendix()
return {
["red"] = "Collar ID: " .. self:GetData("collarID", "UNKNOWN")
}
end
function ITEM:OnInstanced()
self:SetData("Locked", false)
end
function ITEM:OnEquip(client)
local vortPlugin = ix.plugin.Get("vortigaunts")
local character = client:GetCharacter()
local genericdata = character:GetGenericdata()
if character:GetFaction() != FACTION_VORT then return end
if self:GetData("collarID") == nil then
self:SetData("collarID", tostring(vortPlugin:GenerateCollarID(character.id)))
end
self:SetData("Locked", true)
character:SetCollarID(self:GetData("collarID"))
character:SetCollarItemID(self:GetID())
if genericdata and genericdata.collarID == "N/A" then
genericdata.collarID = character:GetCollarID()
character:SetGenericdata(genericdata)
character:Save()
end
if client:HasWeapon("ix_nightvision") then
client:StripWeapon( "ix_nightvision" )
end
if client:HasWeapon("ix_vortbeam") then
client:StripWeapon( "ix_vortbeam" )
end
if client:HasWeapon("ix_vortheal") then
client:StripWeapon( "ix_vortheal" )
end
if client:HasWeapon("ix_vshield") then
client:StripWeapon( "ix_vshield" )
end
if client:HasWeapon("ix_vortpyro") then
client:StripWeapon( "ix_vortpyro" )
end
if client:HasWeapon("ix_vortslam") then
client:StripWeapon( "ix_vortslam" )
end
if client:HasWeapon("ix_vortadvancedbeam") then
client:StripWeapon( "ix_vortadvancedbeam" )
end
client:Give("ix_vortsweep")
if (character:GetBackground() != "Collaborator") then
character:SetBackground("Biotic")
end
local worldmodel = ents.FindInSphere(client:GetPos(), 1);
for _, v in pairs(worldmodel) do
if (v:GetClass() == "ix_nvlight" and v:GetOwner() == client) then
v:Remove()
end
end
end
function ITEM:OnLoadout()
if (self:GetData("equip")) then
local client = self.player
local character = client:GetCharacter()
character:SetCollarID(self:GetData("collarID"))
character:SetCollarItemID(self:GetID())
end
end
function ITEM:OnUnEquip(client)
local character = client:GetCharacter()
if character:GetFaction() != FACTION_VORT then return end
self:SetData("Locked", false)
character:SetCollarID(nil)
character:SetCollarItemID(nil)
if client:HasWeapon("ix_vortsweep") then
client:StripWeapon( "ix_vortsweep" )
if client.broomModel then
client.broomModel:Remove()
end
end
client:Give("ix_nightvision")
client:Give("ix_vortbeam")
client:Give("ix_vortheal")
client:Give("ix_vshield")
client:Give("ix_vortslam")
if (character:GetBackground() != "Collaborator") then
character:SetBackground("Liberated")
end
end
function ITEM:CanEquipOutfit(client)
local player = self.player or client
local bgItems = player:GetCharacter():GetInventory():GetItemsByBase("base_bgclothes", true)
for _, v in ipairs(bgItems) do
if (v:GetData("equip") and v.maxArmor) then
return false
end
end
if !player:HasWhitelist(ix.faction.teams["vortigaunt"].index) then
player:NotifyLocalized("Vous n'êtes pas sur la whitelist de la faction, donc vous ne pouvez pas l'utiliser !")
return false
end
return true
end
ITEM:Hook("drop", function(item)
if item:GetData("Locked") == true then
item.player:NotifyLocalized("Votre collier est verrouillé et vous ne pouvez pas le laisser tomber !")
return false
end
if (item:GetData("equip")) then
item:OnUnEquip(item.player)
item:RemoveOutfit(item:GetOwner())
end
end)

View File

@@ -0,0 +1,110 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Collier Vortigaunt (faux)"
ITEM.description = "Un collier lourd et métallique avec une technologie extraterrestre à l'intérieur. Neutralise complètement la capacité d'un vortigaunt à manipuler les énergies qui l'entourent. Une fois usé, il ne peut pas être retiré sans les outils appropriés."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/vortigaunt_collar.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Face"
ITEM.factionList = {FACTION_VORT}
ITEM.KeepOnDeath = true
ITEM.bodyGroups = {
["collar"] = 1 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}
if (CLIENT) then
function ITEM:GetName()
if LocalPlayer():GetCharacter() then
if LocalPlayer():GetMoveType() == MOVETYPE_NOCLIP or LocalPlayer():GetCharacter():GetFaction() == FACTION_VORT then
return self.name
end
end
return string.sub( self.name, 1, string.len(self.name) - 7 )
end
end
function ITEM:GetColorAppendix()
return {
["red"] = "Collar ID: " .. self:GetData("collarID", "UNKNOWN")
}
end
function ITEM:OnInstanced()
self:SetData("Locked", false)
end
function ITEM:OnEquip(client)
local character = client:GetCharacter()
if (character:GetFaction() != FACTION_VORT) then
return
end
if (!self:GetData("collarOriginalOwnerCharacterID", nil) or self:GetData("collarID", nil) != character:GetCollarID() and self:GetData("collarOriginalOwnerCharacterID", nil)) then
if (!self:GetData("collarID", nil)) then
self:SetData("collarID", tostring(PLUGIN:GenerateCollarID(character.id)))
self:SetData("collarOriginalOwnerCharacterID", character.id)
elseif (character:GetData("CanResetFakeCollarDatafile") != false) then
ix.plugin.list.combineutilities:CreateDatafile(client)
character:SetCollarID(self:GetData("collarID"))
character:SetCollarItemID(self:GetID())
character:SetData("CanResetFakeCollarDatafile", false)
client:Notify("Previous datafile information wiped, generating new data...")
end
end
end
function ITEM:OnLoadout()
if (self:GetData("equip")) then
local client = self:GetOwner()
local character = client:GetCharacter()
if (character:GetFaction() != FACTION_VORT) then return end
if (self:GetData("collarID", nil) and character:GetCollarID() != self:GetData("collarID") and character:GetData("CanResetFakeCollarDatafile") != false) then
character:SetCollarID(self:GetData("collarID"))
character:SetCollarItemID(self:GetID())
end
self:Unequip(self:GetOwner())
end
end
function ITEM:CanEquipOutfit(client)
local character = client:GetCharacter()
if (client:Team() != FACTION_VORT) then
client:NotifyLocalized("You are not whitelisted for the vortigaunt faction, so this is unuseable to you!")
return false
elseif (self:GetData("collarID", "N/A") != character:GetCollarID() and character:GetData("CanResetFakeCollarDatafile") == false) then
client:Notify("You equip a different fake collar, but datafile information is not regenerated.")
end
return true
end
function ITEM:OnUnEquip(client)
end
ITEM:Hook("drop", function(item)
local owner = item:GetOwner()
if (item:GetData("equip")) then
item:OnUnEquip(owner)
item:RemoveOutfit(owner)
end
end)

View File

@@ -0,0 +1,46 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Crochets vortigaunt"
ITEM.description = "Le composant de base des chaînes et des colliers. Ils sont très serrés autour des jambes. Verrouillés en place, ils ne peuvent pas être retirés une fois appliqués."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/vortigaunt_hooks.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Shoes"
ITEM.factionList = {FACTION_VORT}
ITEM.KeepOnDeath = true
ITEM.bodyGroups = {
["hooks"] = 1 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}
function ITEM:OnInstanced()
self:SetData("Locked", false)
end
function ITEM:OnEquip(client)
self:SetData("Locked", true)
end
function ITEM:OnUnEquip()
self:SetData("Locked", false)
end
ITEM:Hook("drop", function(item)
if item:GetData("Locked") == true then
item.player:NotifyLocalized("Your collar is locked so you cannot drop it!")
return false
end
if (item:GetData("equip")) then
item:RemoveOutfit(item:GetOwner())
end
end)

View File

@@ -0,0 +1,35 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Crochets Vortigaunt (faux)"
ITEM.description = "Le composant de base des chaînes et des colliers. Ils sont très serrés autour des jambes. Verrouillés en place, ils ne peuvent pas être retirés une fois appliqués."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/vortigaunt_hooks.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Shoes"
ITEM.factionList = {FACTION_VORT}
ITEM.KeepOnDeath = true
ITEM.bodyGroups = {
["hooks"] = 1 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}
if (CLIENT) then
function ITEM:GetName()
if LocalPlayer():GetCharacter() then
if LocalPlayer():GetMoveType() == MOVETYPE_NOCLIP or LocalPlayer():GetCharacter():GetFaction() == FACTION_VORT then
return self.name
end
end
return string.sub( self.name, 1, string.len(self.name) - 7 )
end
end

View File

@@ -0,0 +1,46 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Chaînes Vortigaunt"
ITEM.description = "Un métal qui lie et entretoise qui resserre les membres et rend les mouvements douloureux. Ils sont verrouillés en place et ne peuvent pas être retirés une fois appliqués.."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/vortigaunt_shackles.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Legs"
ITEM.factionList = {FACTION_VORT}
ITEM.KeepOnDeath = true
ITEM.bodyGroups = {
["shackles"] = 1 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}
function ITEM:OnInstanced()
self:SetData("Locked", false)
end
function ITEM:OnEquip(client)
self:SetData("Locked", true)
end
function ITEM:OnUnEquip()
self:SetData("Locked", false)
end
ITEM:Hook("drop", function(item)
if item:GetData("Locked") == true then
item.player:NotifyLocalized("Your collar is locked so you cannot drop it!")
return false
end
if (item:GetData("equip")) then
item:RemoveOutfit(item:GetOwner())
end
end)

View File

@@ -0,0 +1,35 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Chaînes Vortigaunt (faux)"
ITEM.description = "Un métal qui lie et entretoise qui resserre les membres et rend les mouvements douloureux. Ils sont verrouillés en place et ne peuvent pas être retirés une fois appliqués.."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/vortigaunt_shackles.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Legs"
ITEM.factionList = {FACTION_VORT}
ITEM.KeepOnDeath = true
ITEM.bodyGroups = {
["shackles"] = 1 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}
if (CLIENT) then
function ITEM:GetName()
if LocalPlayer():GetCharacter() then
if LocalPlayer():GetMoveType() == MOVETYPE_NOCLIP or LocalPlayer():GetCharacter():GetFaction() == FACTION_VORT then
return self.name
end
end
return string.sub( self.name, 1, string.len(self.name) - 7 )
end
end

View File

@@ -0,0 +1,23 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Plaque de garde de fourmilion"
ITEM.description = "Fabriquée à partir des peaux blindées épaisses des gardes Antlion tombés au combat, cette armure n'est pas seulement robuste, mais la marque d'un guerrier chevronné."
ITEM.category = "Vortigaunt"
ITEM.model = "models/n7/vorti_outfit/armor.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.maxArmor = 50
ITEM.outfitCategory = "Torso"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["torso"] = 8 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,22 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Vortigaunt Worker Uniform"
ITEM.description = "A sweater of sorts embelished with combine insignia. Suitable to identify worker vortigaunts."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/vort_clothingitems/vort_sweater_cwu.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Torso"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["torso"] = 10 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,22 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Blouse"
ITEM.description = "Un uniforme scientifique pour les vortigaunts à la recherche d'un style de vie plus scientifique."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/vort_clothingitems/vort_doc.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Torso"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["torso"] = 3 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,22 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Blouse de laboratoire Vortigaunt"
ITEM.description = "Un uniforme scientifique pour les vortigaunts à la recherche d'un style de vie plus scientifique."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/vort_clothingitems/vort_doc.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Torso"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["torso"] = 2 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,22 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Sweat à capuche"
ITEM.description = "Un sweat à capuche allongé pour un cou plus long. Parfait pour garder un vortigaunt au chaud même dans les conditions les plus difficiles."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/vort_clothingitems/vort_sweater.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Torso"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["torso"] = 7 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,22 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Poncho raffiné"
ITEM.description = "Un revêtement fiable et solide, Sa composition est dérivée de vêtements humains typiques. La conception ample et les découpes pratiques permettent le confort et la liberté de mouvement."
ITEM.category = "Vortigaunt"
ITEM.model = "models/n7/vorti_outfit/light01.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Torso"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["torso"] = 4 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,22 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Couverture improvisée"
ITEM.description = "Un revêtement simple et uni. Bon pour vous garder bien au chaud par une nuit fraîche, et pas grand-chose d'autre."
ITEM.category = "Vortigaunt"
ITEM.model = "models/n7/vorti_outfit/light02.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Torso"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["torso"] = 5 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,28 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Trench marron"
ITEM.description = "Un trench-coat marron et remis à neuf. Ils garantissent que le corps est chaud et un peu sec. Ça ne fait pas de mal de se fondre non plus."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/clothingitems/torso_refugee_coat.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.iconCam = {
pos = Vector(-39.23, -7.19, 195.95),
ang = Angle(77.11, 10.12, 0),
fov = 4.05
}
ITEM.outfitCategory = "Torso"
ITEM.maxArmor = 25
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["torso"] = 1 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,22 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Vortigaunt Sweater"
ITEM.description = "A sweater made for humans.. A curious vortigaunt might sneak one on. Perfect for keeping a vortigaunt warm in even the toughest conditions."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/vort_clothingitems/vort_sweater.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Torso"
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["torso"] = 9 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,23 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Kevlar"
ITEM.description = "Il n'y a pas de peur pour la mort, mais il n'y a pas non plus de hâte à l'embrasser. Un ensemble standard de kevlar humain, à peu près adapté à pour un vortigaunt."
ITEM.category = "Vortigaunt"
ITEM.model = "models/props_c17/BriefCase001a.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Torso"
ITEM.maxArmor = 25
ITEM.factionList = {FACTION_VORT}
ITEM.bodyGroups = {
["torso"] = 6 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,26 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Vortigaunt Brown Trousers"
ITEM.description = "Even extra-dimensional aliens know that leathery or fabric materials make for substantially comfortable garments."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/vort_clothingitems/vort_pants.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Legs"
ITEM.factionList = {FACTION_VORT}
ITEM.KeepOnDeath = false
ITEM.bodyGroups = {
["shackles"] = 2 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}
ITEM.colorAppendix = {
blue = "Fits on the meat shackles slot",
}

View File

@@ -0,0 +1,23 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Vortigaunt Dark Trousers"
ITEM.description = "Even extra-dimensional aliens know that leathery or fabric materials make for substantially comfortable garments."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/vort_clothingitems/vort_pants2.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Legs"
ITEM.factionList = {FACTION_VORT}
ITEM.KeepOnDeath = false
ITEM.bodyGroups = {
["shackles"] = 3 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,23 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Vortigaunt Dark Blue Trousers"
ITEM.description = "Even extra-dimensional aliens know that leathery or fabric materials make for substantially comfortable garments."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/vort_clothingitems/vort_pants3.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Legs"
ITEM.factionList = {FACTION_VORT}
ITEM.KeepOnDeath = false
ITEM.bodyGroups = {
["shackles"] = 4 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,23 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Vortigaunt Dark Grey Trousers"
ITEM.description = "Even extra-dimensional aliens know that leathery or fabric materials make for substantially comfortable garments."
ITEM.category = "Vortigaunt"
ITEM.model = "models/willardnetworks/vort_clothingitems/vort_pants4.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.outfitCategory = "Legs"
ITEM.factionList = {FACTION_VORT}
ITEM.KeepOnDeath = false
ITEM.bodyGroups = {
["shackles"] = 5 -- The actual name of the bodypart, then number in that bodypart (model-wise)
}

View File

@@ -0,0 +1,126 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
ITEM.name = "Clé de chaîne"
ITEM.model = "models/willardnetworks/props/vortkey.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.description = "Une clé pour déverrouiller des chaînes d'un Vortigaunt."
ITEM.category = "Vortigaunt"
ITEM.colorAppendix = {["red"] = "Cette item peut uniquement être utiliser qu'une seule fois."}
local usedOnItems = {"Collier vortiguant", "Chaînes Vortigaunt", "Crochets vortigaunt"}
ITEM.functions.use = {
name = "Utiliser sur soi",
tip = "applyTip",
icon = "icon16/key.png",
OnCanRun = function(item)
if (item.entity) then return false end
local client = item.player
if (client:GetMoveType() != MOVETYPE_NOCLIP or client:InVehicle()) then return false end
return CAMI.PlayerHasAccess(client, "Helix - Shackles Self Release")
end,
OnRun = function(item)
local character = item.player:GetCharacter()
local foundSomething = false
local collarID = false
if character:IsVortigaunt() then
for _, v in pairs(character:GetInventory():GetItems()) do
if table.HasValue( usedOnItems, v.name ) and v:GetData("equip") == true and v:GetData("Locked") then
if v:GetData("collarID") then
collarID = v:GetData("collarID")
end
v:SetData("Locked", false)
foundSomething = true
end
end
if foundSomething then
ix.combineNotify:AddImportantNotification(collarID and "WRN:// Une clée a été utiliser sur un collier avec l'ID: #" .. collarID or "WRN:// Une clée a été utiliser sur un collier avec une ID inconnu.", Color(255, 81, 0), item.player, item.player:GetPos())
item.player:NotifyLocalized("Vos chaînes ne sont plus verrouillées et peuvent être enlevées...")
return false
else
item.player:NotifyLocalized("Vous ne portez pas de chaînes verrouillées..")
return false
end
else
item.player:NotifyLocalized("Tu nes pas un vortiguant !")
return false
end
end,
}
ITEM.functions.give = {
name = "Utiliser sur le personnage",
tip = "giveTip",
icon = "icon16/key_go.png",
OnCanRun = function(item)
if (item.entity) then return false end
local trace = item.player:GetEyeTraceNoCursor()
local target = trace.Entity
if (!IsValid(target)) then
return false
end
if (CLIENT and target:GetClass() == "prop_ragdoll") then
return true
end
if (IsValid(target.ixPlayer)) then
target = target.ixPlayer
end
if (!target:IsPlayer() or !target:GetCharacter()) then
return false
end
end,
OnRun = function(item)
local target = item.player:GetEyeTraceNoCursor().Entity
if (!IsValid(target)) then
return false
end
if (IsValid(target.ixPlayer)) then
target = target.ixPlayer
end
local targetChar = target:GetCharacter()
local foundSomething = false
local collarID = false
if targetChar:IsVortigaunt() then
for _, v in pairs(targetChar:GetInventory():GetItems()) do
if table.HasValue( usedOnItems, v.name ) and v:GetData("equip") and v:GetData("Locked") then
if v:GetData("collarID") then
collarID = v:GetData("collarID")
end
v:SetData("Locked", false)
foundSomething = true
end
end
if foundSomething then
ix.combineNotify:AddImportantNotification(collarID and "WRN:// Une clée a été utiliser sur un collier avec l'ID: #" .. collarID or "WRN:// Une clée a été utiliser sur le collier avec une ID inconnu.", Color(255, 81, 0), item.player, item.player:GetPos())
item.player:NotifyLocalized("Ses chaînes ne sont plus verrouillées et peuvent être enlevées..")
else
item.player:NotifyLocalized("Il ne porte pas de chaînes verrouillées...")
end
else
item.player:NotifyLocalized("Ce n'est pas un vortiguant !")
end
item.player:EmitSound("physics/metal/metal_box_strain1.wav", 110)
end,
}

View File

@@ -0,0 +1,253 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
Schema.voices.Add("Vortigaunt", "ACCEPT CHARGE", "Accept the charge.", "vortigaunt/ep2/acceptcharge.wav")
Schema.voices.Add("Vortigaunt", "ACCEPT ENERGY", "Accept energy.", "vortigaunt/ep2/acceptenergy.wav")
Schema.voices.Add("Vortigaunt", "GLADLY ACCOMPANY", "Gladly we accompany.", "vortigaunt/ep2/accompany.wav")
Schema.voices.Add("Vortigaunt", "ALERT", "Alert!", "vortigaunt/ep2/alert.wav")
Schema.voices.Add("Vortigaunt", "ALL FOR NOW", "That is all for now.", "vortigaunt/ep2/allfornow.wav")
Schema.voices.Add("Vortigaunt", "ALL IN ONE", "All in one and one in all!", "vortigaunt/ep2/allinoneinall.wav")
Schema.voices.Add("Vortigaunt", "ALLOW RECHARGE", "Allow us to recharge your cells.", "vortigaunt/ep2/allowrecharge.wav")
Schema.voices.Add("Vortigaunt", "ALL WE CAN SPARE", "That is all we can spare.", "vortigaunt/ep2/allwecanspare.wav")
Schema.voices.Add("Vortigaunt", "ALL WE HAVE", "All we have is yours.", "vortigaunt/ep2/allwehave.wav")
Schema.voices.Add("Vortigaunt", "ASSENT", "Assent.", "vortigaunt/ep2/assent.wav")
Schema.voices.Add("Vortigaunt", "THIS BODY", "This body is yours to command.", "vortigaunt/ep2/bodyyours.wav")
Schema.voices.Add("Vortigaunt", "CAUTION", "Caution!", "vortigaunt/ep2/caution.wav")
Schema.voices.Add("Vortigaunt", "WE DEDICATE", "We dedicate ourselves to your purpose!", "vortigaunt/ep2/dedicate.wav")
Schema.voices.Add("Vortigaunt", "DONE", "Done!", "vortigaunt/ep2/done.wav")
Schema.voices.Add("Vortigaunt", "DREAMED", "We have dreamed of this moment!", "vortigaunt/ep2/dreamed.wav")
Schema.voices.Add("Vortigaunt", "EMPOWER US", "Empower us!", "vortigaunt/ep2/empowerus.wav")
Schema.voices.Add("Vortigaunt", "ENERGY EMPOWERS US", "It's energy empowers us!", "vortigaunt/ep2/energyempower.wav")
Schema.voices.Add("Vortigaunt", "FOR FREEDOM", "For freedom!", "vortigaunt/ep2/forfreedom.wav")
Schema.voices.Add("Vortigaunt", "FORWARD", "Forward.", "vortigaunt/ep2/forward.wav")
Schema.voices.Add("Vortigaunt", "GIVE OVER", "Give over your essence!", "vortigaunt/ep2/giveover.wav")
Schema.voices.Add("Vortigaunt", "GLADLY", "Gladly.", "vortigaunt/ep2/gladly.wav")
Schema.voices.Add("Vortigaunt", "GLORIOUS END", "To our glorious end!", "vortigaunt/ep2/gloriousend.wav")
Schema.voices.Add("Vortigaunt", "HALT", "Halt!", "vortigaunt/ep2/halt.wav")
Schema.voices.Add("Vortigaunt", "HERE", "Here.", "vortigaunt/ep2/here.wav")
Schema.voices.Add("Vortigaunt", "HERE WE STAY", "Here we stay.", "vortigaunt/ep2/herewestay.wav")
Schema.voices.Add("Vortigaunt", "HOLD", "Hold.", "vortigaunt/ep2/hold.wav")
Schema.voices.Add("Vortigaunt", "HOLD STILL CANNOT CHARGE", "Hold still, or we cannot charge you!", "vortigaunt/ep2/holdorcantcharge.wav")
Schema.voices.Add("Vortigaunt", "HOLD STILL", "Hold still.", "vortigaunt/ep2/holdstill.wav")
Schema.voices.Add("Vortigaunt", "HONOR WE FOLLOW", "To our honor, we follow you.", "vortigaunt/ep2/honorfollow.wav")
Schema.voices.Add("Vortigaunt", "HONOR IS OURS", "The honor is ours.", "vortigaunt/ep2/honorours.wav")
Schema.voices.Add("Vortigaunt", "IF YOU MOVE", "If you move, we cannot help you.", "vortigaunt/ep2/ifyoumove.wav")
Schema.voices.Add("Vortigaunt", "LEAD ON", "Lead on.", "vortigaunt/ep2/leadon.wav")
Schema.voices.Add("Vortigaunt", "LEAD US", "Lead us.", "vortigaunt/ep2/leadus.wav")
Schema.voices.Add("Vortigaunt", "MOVING TARGET", "We cannot heal a moving target.", "vortigaunt/ep2/movingtarget.wav")
Schema.voices.Add("Vortigaunt", "MUTUAL", "Our purpose is mutual.", "vortigaunt/ep2/mutual.wav")
Schema.voices.Add("Vortigaunt", "NODE NEXUS", "Node Nexus, feed upon this life!", "vortigaunt/ep2/nodenexus.wav")
Schema.voices.Add("Vortigaunt", "ONWARD", "Onward!", "vortigaunt/ep2/onward.wav")
Schema.voices.Add("Vortigaunt", "OUR PLACE", "Our place is here.", "vortigaunt/ep2/ourplacehere.wav")
Schema.voices.Add("Vortigaunt", "PASS ON", "Pass on!", "vortigaunt/ep2/passon.wav")
Schema.voices.Add("Vortigaunt", "WITH PLEASURE", "With pleasure.", "vortigaunt/ep2/pleasure.wav")
Schema.voices.Add("Vortigaunt", "PREPARE TO RECEIVE", "Prepare to receive energy.", "vortigaunt/ep2/prepare.wav")
Schema.voices.Add("Vortigaunt", "PREVAIL", "We shall prevail!", "vortigaunt/ep2/prevail.wav")
Schema.voices.Add("Vortigaunt", "PROPITIOUS", "Propitious alliance.", "vortigaunt/ep2/propitious.wav")
Schema.voices.Add("Vortigaunt", "REGRETTABLE", "This is regrettable.", "vortigaunt/ep2/regrettable.wav")
Schema.voices.Add("Vortigaunt", "RETURN TO AlL", "Return to the all in one!", "vortigaunt/ep2/returntoall.wav")
Schema.voices.Add("Vortigaunt", "RETURN TO VOID", "Return to the void!", "vortigaunt/ep2/returnvoid.wav")
Schema.voices.Add("Vortigaunt", "SATISFACTION", "Satisfaction!", "vortigaunt/ep2/satisfaction.wav")
Schema.voices.Add("Vortigaunt", "STAND CLEAR", "Stand clear!", "vortigaunt/ep2/standclear.wav")
Schema.voices.Add("Vortigaunt", "SURGE", "We surge!", "vortigaunt/ep2/surge.wav")
Schema.voices.Add("Vortigaunt", "TETHER CUT", "The tether is cut!", "vortigaunt/ep2/tethercut.wav")
Schema.voices.Add("Vortigaunt", "THAT IS ALL", "That is all.", "vortigaunt/ep2/thatisall.wav")
Schema.voices.Add("Vortigaunt", "TO THE VOID", "To the void with you!", "vortigaunt/ep2/tothevoid.wav")
Schema.voices.Add("Vortigaunt", "TROUBLE US NO MORE", "That one shall trouble us no more.", "vortigaunt/ep2/troubleus.wav")
Schema.voices.Add("Vortigaunt", "UNDESERVING", "Undeserving of consciousness!", "vortigaunt/ep2/undeserving.wav")
Schema.voices.Add("Vortigaunt", "EXCELLENT", "Excellent!", "vortigaunt/ep2/vort_excellent.wav")
Schema.voices.Add("Vortigaunt", "EXCELLENT SHOOTING", "Excellent shooting!", "vortigaunt/ep2/vort_excellentshooting.wav")
Schema.voices.Add("Vortigaunt", "EXCELLENT SHOT", "Excellent shot!", "vortigaunt/ep2/vort_excellentshot.wav")
Schema.voices.Add("Vortigaunt", "EXCEPTIONAL", "Exceptional.", "vortigaunt/ep2/vort_exceptional.wav")
Schema.voices.Add("Vortigaunt", "GOOD TO FIGHT", "It is good that you now fight with us.", "vortigaunt/ep2/vort_goodfightwithus.wav")
Schema.voices.Add("Vortigaunt", "GOOD TOGETHER", "It is good now that we work together.", "vortigaunt/ep2/vort_goodtogether.wav")
Schema.voices.Add("Vortigaunt", "JUST SO", "Just so.", "vortigaunt/ep2/vort_grp_agree01.wav")
Schema.voices.Add("Vortigaunt", "AGREED", "Agreed.", "vortigaunt/ep2/vort_grp_agree02.wav")
Schema.voices.Add("Vortigaunt", "HMMM", "Hmmm.", "vortigaunt/ep2/vort_grp_agree03.wav")
Schema.voices.Add("Vortigaunt", "AH", "Ah...", "vortigaunt/ep2/vort_grp_agree04.wav")
Schema.voices.Add("Vortigaunt", "YES2", "Yes...", "vortigaunt/ep2/vort_grp_agree05.wav")
Schema.voices.Add("Vortigaunt", "INDEED", "Indeed...", "vortigaunt/ep2/vort_grp_agree06.wav")
Schema.voices.Add("Vortigaunt", "WELL STATED", "Well stated.", "vortigaunt/ep2/vort_grp_agree07.wav")
Schema.voices.Add("Vortigaunt", "SKILLS FORMIDABLE", "Your skills are formidable!", "vortigaunt/ep2/vort_skillsformidable.wav")
Schema.voices.Add("Vortigaunt", "WARE", "Ware!", "vortigaunt/ep2/ware.wav")
Schema.voices.Add("Vortigaunt", "WE ARE YOURS", "We are yours!", "vortigaunt/ep2/weareyours.wav")
Schema.voices.Add("Vortigaunt", "WE CLAIM YOU", "We claim you!", "vortigaunt/ep2/weclaimyou.wav")
Schema.voices.Add("Vortigaunt", "WE SHARE", "We will share the vortessance.", "vortigaunt/ep2/weshare.wav")
Schema.voices.Add("Vortigaunt", "WE WILL CHARGE", "We will charge you.", "vortigaunt/ep2/wewillcharge.wav")
Schema.voices.Add("Vortigaunt", "WE WILL HELP", "We will help you.", "vortigaunt/ep2/wewillhelp.wav")
Schema.voices.Add("Vortigaunt", "YES!", "Yes!", "vortigaunt/ep2/yes.wav")
Schema.voices.Add("Vortigaunt", "YES FORWARD", "Yes, forward.", "vortigaunt/ep2/yesforward.wav")
Schema.voices.Add("Vortigaunt", "I WILL TAKE HER", "I will take her to my kin by another path.", "vo/outland_01/intro/vort_rbed_byanotherpath.wav")
Schema.voices.Add("Vortigaunt", "SHELTERED LOCATION", "My kin will meet us at a sheltered location beneath the surface.", "vo/outland_01/intro/vort_rbed_companions01.wav")
Schema.voices.Add("Vortigaunt", "MUST MOVE HER", "We must move her there quickly.", "vo/outland_01/intro/vort_rbed_companions02.wav")
Schema.voices.Add("Vortigaunt", "YOU ARE UNHARMED", "I am pleased to see at least you are unharmed.", "vo/outland_01/intro/vort_rbed_freeman02.wav")
Schema.voices.Add("Vortigaunt", "HEALING HER WILL REQUIRE", "Healing her will require more than what I alone can conjure.", "vo/outland_01/intro/vort_rbed_freeman04.wav")
Schema.voices.Add("Vortigaunt", "SUMMON MY KIN", "Let me summon my kin.", "vo/outland_01/intro/vort_rbed_freeman05.wav")
Schema.voices.Add("Vortigaunt", "HELP IN THE MINES", "Help awaits us in the mines.", "vo/outland_01/intro/vort_rbed_intomines02.wav")
Schema.voices.Add("Vortigaunt", "HANDS OCCUPIED", "Our hands are occupied.", "vo/outland_01/intro/vort_rbed_letsgo01b.wav")
Schema.voices.Add("Vortigaunt", "DESTROY ALL OBSTACLES", "Destroy all obstacles!", "vo/outland_01/intro/vort_rbed_letsgo01c.wav")
Schema.voices.Add("Vortigaunt", "WE MUST HASTEN", "We must hasten.", "vo/outland_01/intro/vort_rbed_letsgo04a.wav")
Schema.voices.Add("Vortigaunt", "HER STATE IS DELICATE", "Her state is delicate.", "vo/outland_01/intro/vort_rbed_letsgo04b.wav")
Schema.voices.Add("Vortigaunt", "V9", "Chung... corrrrl... malae.", "vo/outland_01/intro/vort_rbed_vemotings01.wav")
Schema.voices.Add("Vortigaunt", "WHAT HARM HAS COME", "What harm has come...", "vo/outland_01/intro/vort_rbed_whatharm.wav")
Schema.voices.Add("Vortigaunt", "THERE ARE MANY ROUTES BELOW", "There are many routes to the dungeon below! I trust you can find your way to join us there.", "vo/outland_01/intro/vort_separation_goodbye02.wav")
Schema.voices.Add("Vortigaunt", "IF NOT SACRIFICE NOT BE FORGOTTEN", "If not, your sacrifice shall not be forgotten!", "vo/outland_01/intro/vort_separation_goodbye03.wav")
Schema.voices.Add("Vortigaunt", "YOU MUST DRAW THEIR AGGRESSION", "You must draw their aggression so I can hurry her to shelter.", "vo/outland_01/intro/vort_separation_leave03.wav")
Schema.voices.Add("Vortigaunt", "SUCCESS", "Success!", "vo/outland_01/intro/vort_separation_success02.wav")
Schema.voices.Add("Vortigaunt", "ALMOST VORTAL", "Almost vortal, this bound between you...", "vo/outland_02/junction/vort_junc_almostvortal.wav")
Schema.voices.Add("Vortigaunt", "KIN SOME DISTANCE", "My kin are still some distance away.", "vo/outland_02/junction/vort_junc_assistance02.wav")
Schema.voices.Add("Vortigaunt", "MUST NOT BE DISTURBED", "For now we must not be disturbed.", "vo/outland_02/junction/vort_junc_assistance03.wav")
Schema.voices.Add("Vortigaunt", "COMBINE HUNTERS", "The Combine hunters cause dramatic injury.", "vo/outland_02/junction/vort_junc_badlyinjured02.wav")
Schema.voices.Add("Vortigaunt", "BEHOLD", "Behold!", "vo/outland_02/junction/vort_junc_behold.wav")
Schema.voices.Add("Vortigaunt", "FAREWELL", "Farewell!", "vo/outland_02/junction/vort_junc_bye01.wav")
Schema.voices.Add("Vortigaunt", "GO SAFELY", "Go safely!", "vo/outland_02/junction/vort_junc_bye02.wav")
Schema.voices.Add("Vortigaunt", "TRAVEL WELL", "Travel well!", "vo/outland_02/junction/vort_junc_bye03.wav")
Schema.voices.Add("Vortigaunt", "EXHAUSTED THEIR NUMBER", "We have exhausted their immediate number.", "vo/outland_02/junction/vort_junc_exhausted.wav")
Schema.voices.Add("Vortigaunt", "REQUIRE YOUR SIGNATURE", "We require your vortal signature!", "vo/outland_02/junction/vort_junc_fmsignature04.wav")
Schema.voices.Add("Vortigaunt", "IMMEASURABLE LOSS", "We have a very immeasurable loss.", "vo/outland_02/junction/vort_junc_immeasurable.wav")
Schema.voices.Add("Vortigaunt", "KILLED MANY ANTLIONS", "We killed many antlions.", "vo/outland_02/junction/vort_junc_killedmanyyet01.wav")
Schema.voices.Add("Vortigaunt", "YET MORE REMAIN", "Yet many more remain.", "vo/outland_02/junction/vort_junc_killedmanyyet02.wav")
Schema.voices.Add("Vortigaunt", "WE KNIT SHATTERED BONE", "We knit shattered bone, and restored circulatory integrity.", "vo/outland_02/junction/vort_junc_knit.wav")
Schema.voices.Add("Vortigaunt", "LIE STILL", "Lie still...", "vo/outland_02/junction/vort_junc_liestill.wav")
Schema.voices.Add("Vortigaunt", "MATTER OF HOURS", "A matter of hours.", "vo/outland_02/junction/vort_junc_matterhours.wav")
Schema.voices.Add("Vortigaunt", "A MOMENT LONGER", "A moment longer.", "vo/outland_02/junction/vort_junc_momentlonger.wav")
Schema.voices.Add("Vortigaunt", "NEXT MATTER", "Now to the next matter of urgency!", "vo/outland_02/junction/vort_junc_nextmatter.wav")
Schema.voices.Add("Vortigaunt", "NO PULSE", "No pulse!", "vo/outland_02/junction/vort_junc_nopulse01.wav")
Schema.voices.Add("Vortigaunt", "HER HEART HAS STOPPED", "Her heart has stopped!", "vo/outland_02/junction/vort_junc_nopulse02.wav")
Schema.voices.Add("Vortigaunt", "THERE IS A QUICKENING", "Yes... there is a quickening!", "vo/outland_02/junction/vort_junc_quicken.wav")
Schema.voices.Add("Vortigaunt", "QUIET THEM", "We shall quiet them.", "vo/outland_02/junction/vort_junc_quietthem.wav")
Schema.voices.Add("Vortigaunt", "RIGHT ROAD", "No fear... we will put you on the right road.", "vo/outland_02/junction/vort_junc_rightroad.wav")
Schema.voices.Add("Vortigaunt", "TRY TO RIsE", "Now, try carefully to rise.", "vo/outland_02/junction/vort_junc_rise.wav")
Schema.voices.Add("Vortigaunt", "REGAINED INTEGRITY", "Her vortal form has regained integrity.", "vo/outland_02/junction/vort_junc_stabilizing02.wav")
Schema.voices.Add("Vortigaunt", "SHE STIRS", "She stirs.", "vo/outland_02/junction/vort_junc_stirs.wav")
Schema.voices.Add("Vortigaunt", "OUR DELAY", "Our delay... regrettable.", "vo/outland_02/junction/vort_junc_weweredelayed.wav")
Schema.voices.Add("Vortigaunt", "DEFEND US", "Defend us!", "vo/outland_02/junction/vort_turret_defendus.wav")
Schema.voices.Add("Vortigaunt", "WE NEED HELP", "We need help!", "vo/outland_02/junction/vort_turret_helpcall01.wav")
Schema.voices.Add("Vortigaunt", "WE ARE UNDER ATTACK", "We are under attack!", "vo/outland_02/junction/vort_turret_helpcall04.wav")
Schema.voices.Add("Vortigaunt", "PROTECT US", "Protect us!", "vo/outland_02/junction/vort_turret_protectus.wav")
Schema.voices.Add("Vortigaunt", "I DESCEND", "I descend.", "vo/outland_03_04/tunnels/vort_04_elevator_descend_01.wav")
Schema.voices.Add("Vortigaunt", "ANTLIONS", "Antlions!", "vo/outland_03_04/tunnels/vort_antlions_arrive_01.wav")
Schema.voices.Add("Vortigaunt", "SAD FATE OF OTHERS", "The sad fate of these others... is our good fortune.", "vo/outland_03_04/tunnels/vort_breakweb02.wav")
Schema.voices.Add("Vortigaunt", "GRIM PINATA", "Grim pinata.", "vo/outland_03_04/tunnels/vort_breakweb03.wav")
Schema.voices.Add("Vortigaunt", "AGREED2", "Agreed.", "vo/outland_03_04/tunnels/vort_extract_agreed.wav")
Schema.voices.Add("Vortigaunt", "AH YES", "Ah, yes!", "vo/outland_03_04/tunnels/vort_extract_ahyes.wav")
Schema.voices.Add("Vortigaunt", "BARE SOME TRAITS", "You bare some traits we thought inate to vortikind.", "vo/outland_03_04/tunnels/vort_extract_bond02.wav")
Schema.voices.Add("Vortigaunt", "ANTLION HUSBANDRY", "Antlion husbandry was once our ancestral practice.", "vo/outland_03_04/tunnels/vort_extract_bond03.wav")
Schema.voices.Add("Vortigaunt", "EXTRACT MOST PRIZED", "The creatures exude many valuable compounds. But the extract is the most prized by far.", "vo/outland_03_04/tunnels/vort_extract_bond04.wav")
Schema.voices.Add("Vortigaunt", "LARVAL EXTRACT", "Ah, excellent. A bounty of larval extract!", "vo/outland_03_04/tunnels/vort_extract_bounty01.wav")
Schema.voices.Add("Vortigaunt", "TAKE A MOMENT", "This should only take a moment.", "vo/outland_03_04/tunnels/vort_extract_bounty02.wav")
Schema.voices.Add("Vortigaunt", "CONSTANT OBSTACLES", "What next in the parade of constant obstacles?", "vo/outland_03_04/tunnels/vort_extract_constantobst.wav")
Schema.voices.Add("Vortigaunt", "OUR DREAMS DO NOT FOLLOW", "I only hope our dreams do not follow them.", "vo/outland_03_04/tunnels/vort_extract_dreamsdonotfollow02.wav")
Schema.voices.Add("Vortigaunt", "SECRETIONS", "Secretions of the finest quality!", "vo/outland_03_04/tunnels/vort_extract_finequality01.wav")
Schema.voices.Add("Vortigaunt", "RIPE PERFECTION", "The scent of ripe perfection beckons.", "vo/outland_03_04/tunnels/vort_extract_hardwork01.wav")
Schema.voices.Add("Vortigaunt", "A HUMAN IS NEEDED", "A human is needed!", "vo/outland_03_04/tunnels/vort_extract_humanmark.wav")
Schema.voices.Add("Vortigaunt", "IMBIDE THE EXTRACT", "Join, now, as we imbide the extract!", "vo/outland_03_04/tunnels/vort_extract_imbibe.wav")
Schema.voices.Add("Vortigaunt", "DEEP SUBMERSION", "This will necessitate deep submersion in the vortessance.", "vo/outland_03_04/tunnels/vort_extract_injuriesdeep02.wav")
Schema.voices.Add("Vortigaunt", "JOIN ME", "Join me.", "vo/outland_03_04/tunnels/vort_extract_joinmefm02.wav")
Schema.voices.Add("Vortigaunt", "EXPECT GREATER RESISTANCE", "Expect ever greater resistance as we proceed!", "vo/outland_03_04/tunnels/vort_extract_keen02.wav")
Schema.voices.Add("Vortigaunt", "GREAT ANTICIPATION", "I will observe with great anticipation.", "vo/outland_03_04/tunnels/vort_extract_puzzling02.wav")
Schema.voices.Add("Vortigaunt", "NO FINER COMPANION", "There is no finer companion.", "vo/outland_03_04/tunnels/vort_extract_yescompanion02.wav")
Schema.voices.Add("Vortigaunt", "QUITE PLEASANT UNDER FOOT", "They are quite pleasant under foot, are they not?", "vo/outland_03_04/tunnels/vort_squishgrub01.wav")
Schema.voices.Add("Vortigaunt", "PLEASING SOUND", "Ah... such a pleasing sound and sensation!", "vo/outland_03_04/tunnels/vort_squishgrub02.wav")
Schema.voices.Add("Vortigaunt", "NO SENTRIES", "I do not see their sentries.", "vo/outland_05/canyon/vort_canyon_enclavesentries02.wav")
Schema.voices.Add("Vortigaunt", "FAR FETCHED", "Such a theory is hardly far-fetched...", "vo/outland_05/canyon/vort_canyon_farfetch.wav")
Schema.voices.Add("Vortigaunt", "SCATTERED COMBINE FORCES", "They gather and unite the scattered Combine forces...", "vo/outland_05/canyon/vort_canyon_podparade02.wav")
Schema.voices.Add("Vortigaunt", "THEY MOVE NORTH", "They move north with great purpose!", "vo/outland_05/canyon/vort_canyon_purpose.wav")
Schema.voices.Add("Vortigaunt", "SENTRIES SHOULD HAVE SPOTTED", "Puzzling. The sentries should have spotted us by now.", "vo/outland_05/canyon/vort_canyon_puzzling.wav")
Schema.voices.Add("Vortigaunt", "OUR URGENT NEED", "They will understand our urgent need.", "vo/outland_05/canyon/vort_canyon_reside02.wav")
Schema.voices.Add("Vortigaunt", "KILL IT WITHOUT CONSEQUENCE", "At this time you may kill it without consequence.", "vo/outland_05/canyon/vort_guard_killit.wav")
Schema.voices.Add("Vortigaunt", "MINDS IN YOUR MIND", "Could you but see the eyes inside your own, the minds in your mind, you would see how much we share.", "vo/npc/vortigaunt/vmono_29.wav")
Schema.voices.Add("Vortigaunt", "GUN POWERLESS", "The gun would appear to be powerless.", "vo/outland_06/bridge/vort_bridge_depleted02.wav")
Schema.voices.Add("Vortigaunt", "IT HAS BEEN AN HONOR", "Likewise! And farewell... it has been an honor!", "vo/outland_06/bridge/vort_bridge_farewell.wav")
Schema.voices.Add("Vortigaunt", "BONDS ARE OF NATURE", "Our bonds are of nature, and require no gratitude.", "vo/outland_06/bridge/vort_bridge_honored.wav")
Schema.voices.Add("Vortigaunt", "MORE URGENT ERRAND", "I fear more urgent errand demands our attention.", "vo/outland_06/bridge/vort_bridge_hunt01.wav")
Schema.voices.Add("Vortigaunt", "REGRETTABLY TRUE", "Regrettably true.", "vo/outland_11a/silo/vort_silo_regrettablytrue.wav")
Schema.voices.Add("Vortigaunt", "COME", "Come!", "HLAComVoice/vortigaunt/come.wav")
Schema.voices.Add("Vortigaunt", "COME ENTER", "Come! Enter.", "HLAComVoice/vortigaunt/comeenter.wav")
Schema.voices.Add("Vortigaunt", "COME IN", "Come in, come in!", "HLAComVoice/vortigaunt/comeincomein.wav")
Schema.voices.Add("Vortigaunt", "COOKING", "Cooking.", "HLAComVoice/vortigaunt/cooking.wav")
Schema.voices.Add("Vortigaunt", "FOR GUIDANCE", "For guidance!", "HLAComVoice/vortigaunt/forguidance.wav")
Schema.voices.Add("Vortigaunt", "GO", "Go!", "HLAComVoice/vortigaunt/go.wav")
Schema.voices.Add("Vortigaunt", "BRAIN INJURY", "I have a brain injury.", "HLAComVoice/vortigaunt/ihaveabraininjury.wav")
Schema.voices.Add("Vortigaunt", "WHY I BROUGHT YOU", "I must show you why I have brought you here.", "HLAComVoice/vortigaunt/imustshowyouwhy.wav")
Schema.voices.Add("Vortigaunt", "IN HERE", "In here!", "HLAComVoice/vortigaunt/inhere.wav")
Schema.voices.Add("Vortigaunt", "IT IS IMPORTANT", "It is important!", "HLAComVoice/vortigaunt/itisimportant.wav")
Schema.voices.Add("Vortigaunt", "CLEAR THE PATH", "I will clear the path.", "HLAComVoice/vortigaunt/iwillclearthepath.wav")
Schema.voices.Add("Vortigaunt", "LOOK HERE", "Look here!", "HLAComVoice/vortigaunt/lookhere.wav")
Schema.voices.Add("Vortigaunt", "BRAIN INJURED", "My brain is injured!", "HLAComVoice/vortigaunt/mybrainisinjured.wav")
Schema.voices.Add("Vortigaunt", "HE WILL BE", "Or... he will be...", "HLAComVoice/vortigaunt/orhewillbe.wav")
Schema.voices.Add("Vortigaunt", "OW", "Ow.", "HLAComVoice/vortigaunt/ow.wav")
Schema.voices.Add("Vortigaunt", "PLEASE COME", "Please! Come...", "HLAComVoice/vortigaunt/pleasecome.wav")
Schema.voices.Add("Vortigaunt", "SUSTENANCE", "Sustenance!", "HLAComVoice/vortigaunt/sustenance.wav")
Schema.voices.Add("Vortigaunt", "COMBINE HAVE OTHER", "The Combine have other of my kin.", "HLAComVoice/vortigaunt/thecombinehaveother.wav")
Schema.voices.Add("Vortigaunt", "THEEE", "The...", "HLAComVoice/vortigaunt/theee.wav")
Schema.voices.Add("Vortigaunt", "THEN YOU WILL", "Then you will.", "HLAComVoice/vortigaunt/thenyouwill.wav")
Schema.voices.Add("Vortigaunt", "THERE", "There!", "HLAComVoice/vortigaunt/there.wav")
Schema.voices.Add("Vortigaunt", "THERE2", "There!", "HLAComVoice/vortigaunt/there2.wav")
Schema.voices.Add("Vortigaunt", "THERE3", "There!", "HLAComVoice/vortigaunt/there3.wav")
Schema.voices.Add("Vortigaunt", "THERE4", "There!", "HLAComVoice/vortigaunt/there4.wav")
Schema.voices.Add("Vortigaunt", "THIS WAY", "This way.", "HLAComVoice/vortigaunt/thisway.wav")
Schema.voices.Add("Vortigaunt", "RIPPED FROM OURSELVES", "We are ripped from ourselves...", "HLAComVoice/vortigaunt/wearerippedfromourselves.wav")
Schema.voices.Add("Vortigaunt", "TRAPPED IN THE DARK", "We have been trapped... in the dark.", "HLAComVoice/vortigaunt/wehavebeentrapped.wav")
Schema.voices.Add("Vortigaunt", "WHAT THEY DO TO US ALL", "What they do to us all.", "HLAComVoice/vortigaunt/whattheydotousall.wav")
Schema.voices.Add("Vortigaunt", "YESSS2", "Yes...", "HLAComVoice/vortigaunt/yesss.wav")
Schema.voices.Add("Vortigaunt", "YOU ARE WELCOME", "You are welcome!", "HLAComVoice/vortigaunt/youarewelcome.wav")
Schema.voices.Add("Vortigaunt", "SAVED MY KIN", "You have saved my kin!", "HLAComVoice/vortigaunt/youhavesavedmykin.wav")
Schema.voices.Add("Vortigaunt", "YOU MUST GO", "You must go!", "HLAComVoice/vortigaunt/youmustgo.wav")
Schema.voices.Add("Vortigaunt", "YOU RECEIVED MY MESSAGES", "You received my messages!", "HLAComVoice/vortigaunt/youreceived.wav")
Schema.voices.Add("Vortigaunt", "YOU WILL BE WELCOME", "You will be welcome!", "HLAComVoice/vortigaunt/youwillbewelcome.wav")
Schema.voices.Add("Vortigaunt", "COURAGE", "Courage!", "HLAComVoice/vortigaunt/courage.wav")
Schema.voices.Add("Vortigaunt", "DO NOT GO", "Do not go yet!", "HLAComVoice/vortigaunt/donotgoyet.wav")
Schema.voices.Add("Vortigaunt", "ENTER", "Enter...", "HLAComVoice/vortigaunt/enter.wav")
Schema.voices.Add("Vortigaunt", "HE IS DEAD", "He is dead.", "HLAComVoice/vortigaunt/heisdead.wav")
Schema.voices.Add("Vortigaunt", "I AM ALONE", "I am alone in my head...", "HLAComVoice/vortigaunt/iamalone.wav")
Schema.voices.Add("Vortigaunt", "I AM DIMINISHED", "I am... diminished.", "HLAComVoice/vortigaunt/iamdiminished.wav")
Schema.voices.Add("Vortigaunt", "I AM SEVERED", "I am severed from the vortessance...", "HLAComVoice/vortigaunt/iamsevered.wav")
Schema.voices.Add("Vortigaunt", "I HAVE COME TO HELP", "I have come to help!", "HLAComVoice/vortigaunt/ihavecometohelp.wav")
Schema.voices.Add("Vortigaunt", "I MUST SHOW YOU SOMETHING", "I must show you something...", "HLAComVoice/vortigaunt/imustshowyou.wav")
Schema.voices.Add("Vortigaunt", "MATTER OF PERSPECTIVE", "It is a matter of perspective.", "HLAComVoice/vortigaunt/itisamatterofperspective.wav")
Schema.voices.Add("Vortigaunt", "IVE BEEN WAITING", "I've been waiting for you.", "HLAComVoice/vortigaunt/ivebeenwaitingforyou.wav")
Schema.voices.Add("Vortigaunt", "NO RIDDLES", "No riddles!", "HLAComVoice/vortigaunt/noriddles.wav")
Schema.voices.Add("Vortigaunt", "NOW GO", "Now go.", "HLAComVoice/vortigaunt/nowgo.wav")
Schema.voices.Add("Vortigaunt", "OUR PATHS DIVERGE", "Our paths diverge.", "HLAComVoice/vortigaunt/ourpathsdiverge.wav")
Schema.voices.Add("Vortigaunt", "THE COMBINE", "The Combine, yes!", "HLAComVoice/vortigaunt/thecombineyes.wav")
Schema.voices.Add("Vortigaunt", "THERE IS NO DISTANCE", "There is no distance between us.", "HLAComVoice/vortigaunt/thereisnodistancebetweenus.wav")
Schema.voices.Add("Vortigaunt", "DISTANT FROM ME", "The vortessance is distant from me...", "HLAComVoice/vortigaunt/thevortessanceisdistant.wav")
Schema.voices.Add("Vortigaunt", "THROUGH THERE", "Through there!", "HLAComVoice/vortigaunt/throughthere.wav")
Schema.voices.Add("Vortigaunt", "WE ARE COTERMINOUS", "We are... coterminous.", "HLAComVoice/vortigaunt/wearecoterminus.wav")
Schema.voices.Add("Vortigaunt", "WE CANNOT FAIL", "We cannot fail.", "HLAComVoice/vortigaunt/wecannotfail.wav")
Schema.voices.Add("Vortigaunt", "WE EACH HAVE OUR PATHS", "We each have our paths.", "HLAComVoice/vortigaunt/weeachhaveourpaths.wav")
Schema.voices.Add("Vortigaunt", "WE WILL NOT ALLOW IT", "We will not allow it.", "HLAComVoice/vortigaunt/wewillnotallow.wav")
Schema.voices.Add("Vortigaunt", "YOUR JOURNEY", "Your journey brings you this far.", "HLAComVoice/vortigaunt/yourjourneybrings.wav")
Schema.voices.Add("Vortigaunt", "V1", "Gerr...", "vortigaunt/ep2/vortigese02.wav")
Schema.voices.Add("Vortigaunt", "V2", "Turr...", "vortigaunt/ep2/vortigese03.wav")
Schema.voices.Add("Vortigaunt", "V3", "Lurr...", "vortigaunt/ep2/vortigese04.wav")
Schema.voices.Add("Vortigaunt", "V4", "Lung...", "vortigaunt/ep2/vortigese05.wav")
Schema.voices.Add("Vortigaunt", "V5", "Gung...", "vortigaunt/ep2/vortigese07.wav")
Schema.voices.Add("Vortigaunt", "V6", "Gah'lung...", "vortigaunt/ep2/vortigese08.wav")
Schema.voices.Add("Vortigaunt", "V7", "Galla'lung...", "vortigaunt/ep2/vortigese09.wav")
Schema.voices.Add("Vortigaunt", "V8", "Turr, lung gurr challa'cher, gung, gong... lurr...", "vortigaunt/ep2/vortigese13.wav")
Schema.voices.AddClass("Vortigaunt", function(client)
return client:IsVortigaunt()
end)

View File

@@ -0,0 +1,39 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local CHAR = ix.meta.character
function CHAR:IsVortigaunt()
local faction = self:GetFaction()
if (faction == FACTION_VORT) then
return true
else
return false
end
end
function CHAR:HasVortalEnergy(amount)
if self:GetVortalEnergy() and self:GetVortalEnergy() >= amount then
return true
end
return false
end
function CHAR:TakeVortalEnergy(amount)
if self:GetPlayer():GetNetVar("ixVortExtract") then return end
self:SetVortalEnergy(math.Clamp(self:GetVortalEnergy() - amount, 0, ix.config.Get("maxVortalEnergy", 100)))
end
function CHAR:AddVortalEnergy(amount)
if self:GetPlayer():GetNetVar("ixVortExtract") then return end
self:SetVortalEnergy(math.Clamp(self:GetVortalEnergy() + amount, 0, ix.config.Get("maxVortalEnergy", 100)))
end

View File

@@ -0,0 +1,36 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local playerMeta = FindMetaTable("Player")
function playerMeta:IsVortigaunt()
return self:GetCharacter() and self:GetCharacter():IsVortigaunt()
end
function playerMeta:HasVortalEnergy(amount)
local character = self:GetCharacter()
if character:GetVortalEnergy() and character:GetVortalEnergy() >= amount then
return true
end
return false
end
function playerMeta:TakeVortalEnergy(amount)
if self:GetNetVar("ixVortExtract") then return end
local character = self:GetCharacter()
character:SetVortalEnergy(math.Clamp(character:GetVortalEnergy() - amount, 0, ix.config.Get("maxVortalEnergy", 100)))
end
function playerMeta:AddVortalEnergy(amount)
if self:GetNetVar("ixVortExtract") then return end
local character = self:GetCharacter()
character:SetVortalEnergy(math.Clamp(character:GetVortalEnergy() + amount, 0, ix.config.Get("maxVortalEnergy", 100)))
end

View File

@@ -0,0 +1,64 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local PLUGIN = PLUGIN
function PLUGIN:PlayerHurt(client, attacker, health, damage)
if (client:GetCharacter():IsVortigaunt()) then
if ((client.ixNextPain or 0) < CurTime() and health > 0) then
local PainVort = {
"vo/npc/vortigaunt/vortigese07.wav",
"vo/npc/vortigaunt/vortigese11.wav",
"vo/npc/vortigaunt/vortigese03.wav"
}
local vort_pain = table.Random(PainVort)
client:EmitSound(vort_pain, 75, math.random(95, 105))
if vort_pain == "vo/npc/vortigaunt/vortigese11.wav" then
client.ixNextPain = CurTime() + 3
else
client.ixNextPain = CurTime() + 1.5
end
end
end
end
function PLUGIN:GetPlayerDeathSound(client)
if (client:GetCharacter():IsVortigaunt()) then
return false
end
end
function PLUGIN:CheckCanTransferToEquipSlots(itemTable, oldInv, inventory)
local client = itemTable.player or (oldInv and oldInv.GetOwner and oldInv:GetOwner()) or itemTable.GetOwner and itemTable:GetOwner()
if client and IsValid(client) then
if client:IsVortigaunt() and itemTable:GetData("Locked", false) then
return false, "Votre collier est verrouillé, vous ne pouvez donc pas le retirer!"
end
end
end
function PLUGIN:PostCanTransferToEquipSlots(owner, itemTable, oldInv, inventory)
if owner.IsVortigaunt and owner:IsVortigaunt() then
if y == 10 then
return false, "Les Vortigaunts ne peuvent pas équiper de tenues dans cet emplacement!"
end
local factionList = itemTable.factionList and istable(itemTable.factionList) and itemTable.factionList or false
if !factionList or factionList and !table.HasValue(factionList, FACTION_VORT) then
if !itemTable.isBag then
return false, "Ce ne sont pas des vêtements destinés aux vortigaunts!"
end
end
end
end

View File

@@ -0,0 +1,559 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local PLUGIN = PLUGIN
local ix = ix
local CAMI = CAMI
PLUGIN.name = "Vortigaunt Features"
PLUGIN.description = "Adds certain features to vortigaunt."
PLUGIN.author = "Fruity, Adolphus"
PLUGIN.BATCH = 50
PLUGIN.vortalEnergyPerAntlion = 5
PLUGIN.vortalEnergyPerPlayer = 15
PLUGIN.passiveVortalEnergyIncome = 0.1
PLUGIN.passiveVortalEnergyTime = 8
PLUGIN.vortalEnergyPerAntlion = 5
PLUGIN.vortalEnergyPerPlayer = 15
PLUGIN.passiveVortalEnergyIncome = 0.1
PLUGIN.passiveVortalEnergyTime = 8
PLUGIN.vortnotes = {}
PLUGIN.voidChar = 13827
PLUGIN.voidKey = 34217
game.AddParticles( "particles/wn_vortigaunt_fx_blue.pcf" )
game.AddParticles( "particles/wn7_vort_shield.pcf" )
PrecacheParticleSystem( "vort_shield_parent" )
PrecacheParticleSystem("vort_meditation")
CAMI.RegisterPrivilege({
Name = "Helix - Manage Vortessence Menu",
MinAccess = "admin"
})
CAMI.RegisterPrivilege({
Name = "Helix - Set Vortigaunt Allow Reset Collar",
MinAccess = "admin"
})
CAMI.RegisterPrivilege({
Name = "Helix - Shackles Self Release",
MinAccess = "superadmin"
})
ix.flag.Add("N", "Vortigaunt nulled", function(client, isGiven)
client:SetNetVar("ixVortNulled", isGiven)
end)
ix.flag.Add("q", "Bouclier Vortigaunt", function(client, isGiven) return end)
ix.flag.Add("f", "Can unlock shackles.", function(client, isGiven)
client:SetNetVar("ixVortUnlock", isGiven and isGiven or nil)
end)
ix.lang.AddTable("english", {
optVortSensingDisable = "Désactiver la détection Vort",
optdVortSensingDisable = "Si la detection vort doit être désactivé.",
})
ix.lang.AddTable("french", {
optVortSensingDisable = "Désactiver la détection Vort",
optdVortSensingDisable = "Si la detection vort doit être désactivé.",
})
ix.option.Add("vortSensingDisable", ix.type.bool, true, {
category = "other",
hidden = function()
return !LocalPlayer():IsVortigaunt()
end,
bNetworked = true
})
ix.config.Add("maxVortalEnergy", 100, "Maximum vortal energy amount available for vortigaunts.", nil, {
data = {min = 1, max = 500},
category = "Vortigaunts"
})
ix.config.Add("maxVortEnergyPerMinuteOfDefaultMeditation", 10, "Default VE income per every minute of meditation in percents.", nil, {
data = {min = 1, max = 100},
category = "Vortigaunts"
})
ix.config.Add("maxVortEnergyPerMinuteOfAdvancedMeditation", 30, "Default VE income per every minute of meditation in percents for 50lvl vortessence vorts.", nil, {
data = {min = 1, max = 100},
category = "Vortigaunts"
})
ix.config.Add("additionalVortalEnergyDrainPerPointOfArmor", 1, "Additional VE drain per point of armor.", nil, {
data = {min = 1, max = 100},
category = "Vortigaunts"
})
ix.config.Add("vortalEnergyTickTime", 8, "How many seconds it takes to update vortal energy data for vorts.", nil, {
data = {min = 1, max = 8},
category = "Vortigaunts"
})
ix.config.Add("vortBeamAdditionalDamage", 1, "Vort beam damage.", function(oldValue, newValue)
for _, v in ipairs(ents.FindByClass("ix_vortbeam")) do
v.Primary.Damage = newValue
end
end, {
data = {min = 1, max = 250},
category = "Vortigaunt Beam SWEP"
})
ix.config.Add("advancedBeamDamage", 1, "Advanced beam damage.", function(oldValue, newValue)
for _, v in ipairs(ents.FindByClass("ix_vortbeam")) do
v.Primary.Damage = newValue
end
end, {
data = {min = 1, max = 500},
category = "Advanced Vortigaunt Beam SWEP"
})
ix.config.Add("vortSlamBaseDamage", 40, "Vort slam damage.", function(oldValue, newValue)
for _, v in ipairs(ents.FindByClass("ix_vortslam")) do
v.Primary.Damage = newValue
end
end, {
data = {min = 40, max = 250},
category = "Vortigaunt Slam SWEP"
})
ix.char.RegisterVar("collarID", {
field = "collarID",
fieldType = ix.type.string,
default = nil,
bNoDisplay = true,
OnSet = function(self, value)
local client = self:GetPlayer()
if (IsValid(client)) then
local character = client:GetCharacter()
local genericdata = character:GetGenericdata()
self.vars.collarID = value
if (genericdata) then
genericdata.collarID = value
character:SetGenericdata(genericdata)
character:Save()
end
end
end,
OnGet = function(self, default)
local collarID = self.vars.collarID
return collarID
end
})
ix.char.RegisterVar("collarItemID", {
field = "collarItemID",
fieldType = ix.type.number,
default = nil,
bNoDisplay = true
})
ix.char.RegisterVar("vortalEnergy", {
field = "vortalEnergy",
fieldType = ix.type.number,
default = ix.config.Get("maxVortalEnergy", 100),
isLocal = true,
bNoDisplay = true,
OnSet = function(self, value)
local client = self:GetPlayer()
if !client:IsVortigaunt() then
return "No."
end
if (IsValid(client)) then
self.vars.vortalEnergy = value
net.Start("ixCharacterVarChanged")
net.WriteUInt(self:GetID(), 32)
net.WriteString("vortalEnergy")
net.WriteType(self.vars.vortalEnergy)
net.Send(client)
end
end,
OnAdjust = function(self, client, data, value, newData)
if !client:IsVortigaunt() then return "No." end
newData.vortalEnergy = value
end
})
ix.char.RegisterVar("BioticPDA", {
field = "BioticPDA",
fieldType = ix.type.string,
default = "N/A",
bNoDisplay = true,
OnSet = function(self, value)
local client = self:GetPlayer()
if (!client:IsVortigaunt()) then
return
end
if (IsValid(client)) then
self.vars.BioticPDA = value
net.Start("ixCharacterVarChanged")
net.WriteUInt(self:GetID(), 32)
net.WriteString("BioticPDA")
net.WriteType(self.vars.BioticPDA)
net.Send(client)
end
end
})
ix.command.Add("ToggleVortalSensing", {
description = "Toggle vortal sensing.",
OnRun = function(self, client, arguments)
local bDisabled = ix.option.Get(client, "vortSensingDisable", true)
ix.option.Set(client, "vortSensingDisable", !bDisabled)
client:Notify("Vous avez " .. (bDisabled and "activé" or "désactivé") .. " vortal-sensil.")
end,
OnCheckAccess = function(self, client)
return client:IsVortigaunt()
end
})
ix.command.Add("ToggleVortalVision", {
description = "Toggle vortal vision.",
OnRun = function(self, client, arguments)
if !client:GetLocalVar("vortalVision") then
client:SetLocalVar("vortalVision", true)
client:Notify("You have enabled vortal vision.")
netstream.Start(client, "ToggleVortalVision", true)
else
client:SetLocalVar("vortalVision", false)
client:Notify("You have disabled vortal vision.")
netstream.Start(client, "ToggleVortalVision", false)
end
end,
OnCheckAccess = function(self, client)
return client:IsVortigaunt()
end
})
ix.command.Add("VortStun", {
description = "Stun someone in front of you.",
OnRun = function(self, client)
local percentage = 10 / 100
if !client:HasVortalEnergy(10 + (percentage * client:Armor())) then
return client:NotifyLocalized("You don't have enough vortal energy.")
end
local forward = client:EyeAngles():Forward()
local tr = util.QuickTrace(client:EyePos(), forward * 128, client)
if !IsValid(tr.Entity) or !tr.Entity:IsPlayer() or tr.Entity.ixRagdoll or !tr.Entity:Alive() then
return client:NotifyLocalized("Invalid target!")
end
if tr.Entity:IsVortigaunt() and tr.Entity:GetNetVar("ixVortMeditation") then
return client:NotifyLocalized("Can't stun meditating vort!")
end
if client:GetNetVar("ixVortMeditation") then
return client:NotifyLocalized("Can't stun while meditating!")
end
ParticleEffectAttach("vortigaunt_charge_token", PATTACH_POINT_FOLLOW, client, client:LookupAttachment("rightclaw"))
client:PlayGestureAnimation(client:LookupSequence("gest_heal"))
timer.Simple(2.25, function()
if (!IsValid(client) or !IsValid(tr.Entity) or tr.Entity.ixRagdoll) or !tr.Entity:Alive() then
if IsValid(client) then
client:StopParticles()
end
return
end
if tr.Entity:IsVortigaunt() and tr.Entity:GetNetVar("ixVortMeditation") then
client:StopParticles()
return client:NotifyLocalized("Can't stun meditating vort!")
end
if client:GetNetVar("ixVortMeditation") then
client:StopParticles()
return client:NotifyLocalized("Can't stun while meditating!")
end
client:TakeVortalEnergy(10 + (percentage * client:Armor()))
tr.Entity:SetRagdolled(true, 30)
client:GetCharacter():DoAction("vort_beam_practice")
client:EmitSound( "npc/vort/health_charge.wav", 100, 150, 1, CHAN_AUTO )
client:StopParticles()
end)
end,
OnCheckAccess = function(self, client)
if client:IsVortigaunt() and !client:GetNetVar("ixVortNulled") then return true end
end
})
ix.command.Add("VortUnlock", {
description = "Unlock someone's shackles.",
OnRun = function(self, client)
local forward = client:EyeAngles():Forward()
local tr = util.QuickTrace(client:EyePos(), forward * 128, client)
if !IsValid(tr.Entity) or !tr.Entity:IsPlayer() or !tr.Entity:IsVortigaunt() or !tr.Entity:Alive() then
return client:NotifyLocalized("Invalid target!")
end
ParticleEffectAttach("vortigaunt_charge_token", PATTACH_POINT_FOLLOW, client, client:LookupAttachment("rightclaw"))
client:PlayGestureAnimation(client:LookupSequence("gest_heal"))
timer.Simple(2.25, function()
if (!IsValid(client) or !IsValid(tr.Entity) or !tr.Entity:IsVortigaunt()) or !tr.Entity:Alive() then
if IsValid(client) then
client:StopParticles()
end
return
end
client:EmitSound( "npc/vort/health_charge.wav", 100, 150, 1, CHAN_AUTO )
client:StopParticles()
local character = tr.Entity:GetCharacter()
local usedOnItems = {"Vortigaunt Collar", "Vortigaunt Shackles", "Vortigaunt Hooks"}
local foundSomething = false
local collarID = false
for _, v in pairs(character:GetInventory():GetItems()) do
if table.HasValue( usedOnItems, v.name ) and v:GetData("equip") == true and v:GetData("Locked") then
if v:GetData("collarID") then
collarID = v:GetData("collarID")
end
v:SetData("Locked", false)
foundSomething = true
end
end
if foundSomething then
ix.combineNotify:AddImportantNotification(collarID and "WRN:// Vortigaunt shackles have received critical damage. Collar ID: #" .. collarID or "WRN:// Vortigaunt shackles have received critical damage. Collar ID: UNKNOWN.", Color(255, 81, 0), tr.Entity, tr.Entity:GetPos())
tr.Entity:NotifyLocalized("Your shackles are no longer locked and can be taken off..")
else
tr.Entity:NotifyLocalized("You are not wearing any locked shackles..")
return
end
client:GetCharacter():DoAction("vort_beam_practice")
end)
end,
OnCheckAccess = function(self, client)
if client:IsVortigaunt() and client:GetNetVar("ixVortUnlock") then return true end
end
})
ix.command.Add("EnterMeditation", {
description = "Toggle vortal meditation and restore your vortal energy.",
OnRun = function(self, client)
if client:GetNetVar("ixVortMeditation") then
PLUGIN:ExitVortalMeditation(client)
else
PLUGIN:EnterVortalMeditation(client)
end
end,
OnCheckAccess = function(self, client)
if client:IsVortigaunt() and !client:GetNetVar("ixVortNulled") then return true end
end
})
ix.command.Add("SetBioticPDA", {
description = "Set access to either CWU or CMU datapad.",
arguments = {
ix.type.character,
ix.type.string
},
adminOnly = true,
OnRun = function(self, client, character, data)
if character:IsVortigaunt() then
if (data and data == "CWU" or data and data == "CMU") then
character:SetBioticPDA(data)
character:SetData("BioticPDA", data)
client:NotifyLocalized("Biotic PDA access set to " .. data)
else
client:NotifyLocalized("You must specify either 'CMU' or 'CWU'!")
return false
end
else
client:NotifyLocalized("The character provided is not a vortigaunt!")
return false
end
end,
OnCheckAccess = function(self, client)
return CAMI.PlayerHasAccess(client, "Helix - Manage Vortessence Menu")
end
})
ix.command.Add("SetVortAllowResetCollar", {
description = "Allows a Vortigaunt to reset their datafile from previous data after equipping a fake collar.",
arguments = {
ix.type.character,
ix.type.bool
},
adminOnly = true,
OnRun = function(self, client, character, bool)
if (character:GetFaction() == FACTION_VORT and character:GetBackground() != "Biotic" and character:GetBackground() != "Collaborator") then
if (bool) then
character:SetData("CanResetFakeCollarDatafile", true)
else
character:SetData("CanResetFakeCollarDatafile", false)
end
ix.log.AddRaw("[FAKE COLLAR] " .. client:Nick() .. " changed SetVortAllowResetCollar for " .. character:GetName() .. " to " .. tostring(bool))
end
end,
OnCheckAccess = function(self, client)
return CAMI.PlayerHasAccess(client, "Helix - Set Vortigaunt Allow Reset Collar")
end
})
ix.anim.SetModelClass("models/willardnetworks/vortigaunt.mdl", "vortigaunt")
ix.util.Include("sh_hooks.lua")
ix.util.Include("cl_hooks.lua")
ix.util.Include("cl_plugin.lua")
ix.util.Include("sv_hooks.lua")
ix.util.Include("meta/sh_character.lua")
ix.util.Include("meta/sh_player.lua")
ix.config.Add("VortHealMin", 5, "Valeur minimale pour la santé qui peut être guérie par Vortessence" , nil, {
data = {min = 1, max = 100},
category = "Soins - Vortigaunt"
})
ix.config.Add("VortHealMax", 20, "Valeur sanitaire maximale qui peut être guérie par Vortessence" , nil, {
data = {min = 1, max = 100},
category = "Soins - Vortigaunt"
})
ix.config.Add("VortShieldRecharge", 20, "Combien de temps faut-il pour recharger le bouclier anti-vortex" , nil, {
data = {min = 1, max = 200},
category = "Bouclier - Vortigaunt"
})
ix.config.Add("VortShieldHealth", 500, "Quelle est la santé du vortex" , nil, {
data = {min = 1, max = 1000},
category = "Bouclier - Vortigaunt"
})
ix.config.Add("extractEffectDuration", 1800, "How many seconds stays extract effect." , nil, {
data = {min = 1, max = 3800},
category = "Vortigaunts"
})
ix.config.Add("blacklistSCAmount", 50, "If vort collar have a negative SC point and its below this value - vort collar being blacklisted." , nil, {
data = {min = 1, max = 999},
category = "Vortigaunts"
})
ix.command.Add("vortessence", {
description = "Ouvrir le menu vortessence comme Vortessence.",
OnCheckAccess = function(self, client)
local faction = client:GetCharacter():GetFaction()
if (faction == FACTION_VORT and !client:GetNetVar("ixVortNulled")) or CAMI.PlayerHasAccess(client, "Helix - Manage Vortessence Menu") then
return true
end
return false
end,
OnRun = function(self, client)
PLUGIN:RefreshVortessence(client)
end
})
ix.command.Add("UnlockShackles", {
description = "Silently unlock shackles of a certain vort.",
arguments = {
ix.type.character,
},
adminOnly = true,
OnRun = function(self, client, character)
local foundSomething = false
local usedOnItems = {"Vortigaunt Collar", "Vortigaunt Shackles", "Vortigaunt Hooks"}
if character:IsVortigaunt() then
for _, v in pairs(character:GetInventory():GetItems()) do
if table.HasValue( usedOnItems, v.name ) and v:GetData("equip") == true and v:GetData("Locked") then
v:SetData("Locked", false)
foundSomething = true
end
end
if foundSomething then
character:GetPlayer():NotifyLocalized("Your shackles are no longer locked and can be taken off..")
return false
else
character:GetPlayer():NotifyLocalized("You are not wearing any locked shackles..")
return false
end
else
character:GetPlayer():NotifyLocalized("You are not a vortigaunt!")
return false
end
end
})
ix.command.Add("SetVortalEnergy", {
description = "Sets vortal energy to certain vortigaunt.",
arguments = {
ix.type.character,
ix.type.number,
},
adminOnly = true,
OnRun = function(self, client, character, value)
if character:IsVortigaunt() then
client:NotifyLocalized("You just setted " .. value .. " of vortal energy to " .. character:GetName())
character:SetVortalEnergy(math.Clamp(value, 0, 100))
else
client:NotifyLocalized("Your target is not a vortigaunt!")
end
end
})
ix.command.Add("AddVortalEnergy", {
description = "Adds vortal energy to certain vortigaunt.",
arguments = {
ix.type.character,
ix.type.number,
},
adminOnly = true,
OnRun = function(self, client, character, value)
if character:IsVortigaunt() then
client:NotifyLocalized("You just added " .. value .. " of vortal energy to " .. character:GetName())
character:AddVortalEnergy(math.Clamp(value, 0, 100))
else
client:NotifyLocalized("Your target is not a vortigaunt!")
end
end
})
ix.command.Add("TakeVortalEnergy", {
description = "Takes vortal energy from certain vortigaunt.",
arguments = {
ix.type.character,
ix.type.number,
},
adminOnly = true,
OnRun = function(self, client, character, value)
if character:IsVortigaunt() then
client:NotifyLocalized("You just took " .. value .. " of vortal energy from " .. character:GetName())
character:TakeVortalEnergy(math.Clamp(value, 0, 100))
else
client:NotifyLocalized("Your target is not a vortigaunt!")
end
end
})
function PLUGIN:CharacterLoaded(character)
if (SERVER) then
character:SetBioticPDA(character:GetData("BioticPDA", "N/A"))
end
end

View File

@@ -0,0 +1,392 @@
--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local PLUGIN = PLUGIN
local ix = ix
local timer = timer
util.AddNetworkString("ixVortNotes")
function PLUGIN:DatabaseConnected()
local query = mysql:Create("ix_vortessence")
query:Create("note_id", "INT(11) UNSIGNED NOT NULL AUTO_INCREMENT")
query:Create("note_title", "TEXT")
query:Create("note_text", "TEXT")
query:Create("note_date", "TEXT")
query:Create("note_poster", "TEXT")
query:Create("note_category", "TEXT")
query:PrimaryKey("note_id")
query:Execute()
end
function PLUGIN:RefreshVortessence(client, lastSelected)
PLUGIN:GetVortessenceUpdates(client, lastSelected)
end
function PLUGIN:GetVortessenceUpdates(client, lastSelected)
if (!client:IsVortigaunt() and !CAMI.PlayerHasAccess(client, "Helix - Manage Vortessence Menu")) then
return false
end
local query = mysql:Select("ix_vortessence")
query:Select("note_id")
query:Select("note_title")
query:Select("note_text")
query:Select("note_date")
query:Select("note_poster")
query:Select("note_category")
query:Callback(function(result)
if (!istable(result)) then
self:OpenVortessenceMenu(client)
return
end
if (!table.IsEmpty(PLUGIN.vortnotes)) then
table.Empty(PLUGIN.vortnotes)
end
PLUGIN.vortnotes = result
self:OpenVortessenceMenu(client, lastSelected)
end)
query:Execute()
end
function PLUGIN:CreateVortalTimer(client, character, uniqueID)
timer.Create(uniqueID, ix.config.Get("vortalEnergyTickTime", 1), 0, function()
if (IsValid(client)) then
PLUGIN:HandleVortalTimer(client, character)
else
timer.Remove(uniqueID)
end
end)
end
function PLUGIN:PlayerLoadedCharacter(client, character, lastChar)
if client:GetNetVar("ixVortMeditation") then
client:SetNetVar("ixVortMeditation", nil)
client:StopParticles()
end
if client:GetNetVar("ixVortExtract") then
client:SetNetVar("ixVortExtract", nil)
end
local uniqueID = "ixVortalEnergy" .. client:SteamID64()
if (timer.Exists(uniqueID)) then
timer.Remove(uniqueID)
end
if !character:IsVortigaunt() and client.ixNextVortalEnergy then
client.ixNextVortalEnergy = nil
return
elseif !character:IsVortigaunt() then
return
end
client.ixNextVortalEnergy = CurTime()
PLUGIN:CreateVortalTimer(client, character, uniqueID)
end
function PLUGIN:HandleVortalTimer(client, character)
if CurTime() > client.ixNextVortalEnergy then
client.ixNextVortalEnergy = CurTime() + PLUGIN.passiveVortalEnergyTime
character:AddVortalEnergy(PLUGIN.passiveVortalEnergyIncome)
end
end
function PLUGIN:OnNPCKilled(npc, attacker, inflictor)
if !attacker:IsPlayer() then return end
if attacker.IsVortigaunt and !attacker:IsVortigaunt() then return end
if npc:GetClass() == "npc_antlion" then
local character = attacker:GetCharacter()
character:AddVortalEnergy(PLUGIN.vortalEnergyPerAntlion)
attacker:ScreenFade(SCREENFADE.IN, Color(38, 106, 46, 128), 1, 1)
end
end
function PLUGIN:ExtractConsume(client, character)
if client:GetNetVar("ixVortExtract") or timer.Exists("ixVortigauntExtract" .. client:SteamID64()) then return end
local overpoweredVorts = {}
local eff = EffectData()
eff:SetOrigin(client:GetPos())
util.Effect("extract_use", eff)
client:EmitSound("ambience/3d-sounds/xen-vorts/vort_09.mp3", 120)
client:SetSkin(1)
client:ForceSequence("eat_nectar", function()
client:EmitSound("ambience/3d-sounds/xen-vorts/vort_06.mp3", 120)
for _, vort in pairs(ents.FindInSphere(client:GetPos(), 500)) do
if vort:IsPlayer() and vort:IsVortigaunt() and !vort:GetNetVar("ixVortNulled") then
vort:SetSkin(1)
vort:AddVortalEnergy(ix.config.Get("maxVortalEnergy", 100))
vort:SetNetVar("ixVortExtract", true)
vort:ScreenFade(SCREENFADE.IN, Color(140, 0, 183, 128), 1, 1)
overpoweredVorts[#overpoweredVorts + 1] = vort
end
end
timer.Create("ixVortigauntExtract" .. client:SteamID64(), ix.config.Get("extractEffectDuration"), 1, function()
for _, vort in pairs(overpoweredVorts) do
if vort:IsVortigaunt() then
vort:SetSkin(vort:GetCharacter():GetData("skin", 0))
vort:SetNetVar("ixVortExtract", nil)
end
end
end)
end, nil, nil)
end
function PLUGIN:HandlePlayerKill(client, vort)
vort:ScreenFade(SCREENFADE.IN, Color(38, 106, 46, 128), 1, 1)
vort:AddVortalEnergy(PLUGIN.vortalEnergyPerPlayer)
end
function PLUGIN:EnterVortalMeditation(client)
local character = client:GetCharacter()
client:SelectWeapon("ix_hands")
client:SetNetVar("ixVortMeditation", true)
client:SetRunSpeed(1)
client:SetWalkSpeed(1)
client:SetJumpPower(1)
ParticleEffectAttach("vort_meditation", PATTACH_ABSORIGIN_FOLLOW, client, 0)
client:EmitSound("ambience/3d-sounds/xen-vorts/vort_0" .. math.random(1, 5) .. ".mp3")
local uniqueID = "ixMeditation" .. client:SteamID64()
timer.Create(uniqueID, 60, 0, function()
if !IsValid(client) or !client:IsVortigaunt() or !client:GetNetVar("ixVortMeditation") then
if IsValid(client) then
client:SetNetVar("ixVortMeditation", nil)
end
timer.Remove(uniqueID)
return
end
local percentage = ix.config.Get("maxVortalEnergy") / 100
local randSound = math.random(1, 10)
client:EmitSound(randSound <= 9 and "ambience/3d-sounds/xen-vorts/vort_0" .. randSound .. ".mp3" or "ambience/3d-sounds/xen-vorts/vort_" .. randSound .. ".mp3")
client:ScreenFade(SCREENFADE.IN, Color(38, 106, 46, 128), 1, 1)
character:AddVortalEnergy(character:GetSkillLevel("vort") != 50 and (percentage * ix.config.Get("maxVortEnergyPerMinuteOfDefaultMeditation", 10)) or (percentage * ix.config.Get("maxVortEnergyPerMinuteOfAdvancedMeditation", 30)))
end)
end
function PLUGIN:ExitVortalMeditation(client)
client:SetNetVar("ixVortMeditation", nil)
client:SetRunSpeed(ix.config.Get("runSpeed") * 1.25)
client:SetWalkSpeed(ix.config.Get("walkSpeed"))
client:SetJumpPower(250)
client:StopParticles()
end
function PLUGIN:PlayerSwitchWeapon( client, oldWeapon, newWeapon )
if client:GetNetVar("ixVortMeditation") then
return true
end
end
function PLUGIN:OpenVortessenceMenu(client, lastSelected)
if client:IsVortigaunt() or CAMI.PlayerHasAccess(client, "Helix - Manage Vortessence Menu") then
local count = table.Count(self.vortnotes)
local send = 1
for k, v in pairs(self.vortnotes) do
if (send % PLUGIN.BATCH == 1) then
if (send > 1) then
net.Send(client)
end
net.Start("ixVortNotes")
net.WriteUInt(count, 32)
net.WriteUInt(send, 32)
end
net.WriteUInt(k, 32)
net.WriteTable(v)
send = send + 1
end
net.WriteUInt(lastSelected or 0, 32)
net.Send(client)
end
end
function PLUGIN:PlayerDisconnected(client)
for _, v in pairs(ents.FindByClass("ix_nvlight")) do
if (v:GetOwner() == client) then
v:Remove()
end
end
end
netstream.Hook("AddNoteVortessence", function(client, title, text, category)
if !client:IsVortigaunt() then client:NotifyLocalized("Tu n'es pas un vortigant!") return false end
local timestamp = os.date( "%d.%m.%Y" )
local queryObj = mysql:Insert("ix_vortessence")
queryObj:Insert("note_title", title)
queryObj:Insert("note_text", text)
queryObj:Insert("note_date", timestamp)
queryObj:Insert("note_poster", client:Name())
queryObj:Insert("note_category", category)
queryObj:Execute()
PLUGIN:RefreshVortessence(client, category)
client:NotifyLocalized("Vous avez ajouté une note!")
ix.log.Add(client, "vortessenceEntry", "added a vortessence entry")
client:GetCharacter():DoAction("vort_beam_practice")
end)
netstream.Hook("RemoveNoteVortessence", function(client, id, category)
if !CAMI.PlayerHasAccess(client, "Helix - Manage Vortessence Menu") then return end
local queryObj = mysql:Delete("ix_vortessence")
queryObj:Where("note_id", id)
queryObj:Execute()
PLUGIN:RefreshVortessence(client, category)
ix.log.Add(client, "vortessenceEntry", "removed a vortessence entry")
end)
function PLUGIN:CharacterRecognized(client, recogCharID, targets)
local fakeName = client:GetCharacter():GetFakeName()
for _, v in ipairs(targets) do
if v:IsVortigaunt() then
local vortrecognition = ix.data.Get("vortrecog", {}, false, true)
if vortrecognition[recogCharID] == true then
break
end
if (fakeName and fakeName != "") then
vortrecognition[recogCharID] = fakeName
else
vortrecognition[recogCharID] = true
end
ix.data.Set("vortrecog", vortrecognition, false, true)
break
end
end
end
function PLUGIN:PostPlayerLoadout(client)
local background = client:GetCharacter():GetBackground()
local character = client:GetCharacter()
if (background == "Liberated" or background == "Free") then
timer.Simple(1, function()
if client then
client:Give("ix_vortsweep")
client:Give("ix_nightvision")
client:Give("ix_vortbeam")
client:Give("ix_vortheal")
client:Give("ix_vshield")
client:Give("ix_vortslam")
if character:GetSkillLevel("vort") >= 50 then
client:Give("ix_vortpyro")
client:Give("ix_vortadvancedbeam")
end
end
end)
end
if background == "Biotic" then
timer.Simple(1, function()
if client then
client:Give("ix_vortsweep")
if client:HasWeapon("ix_nightvision") then
client:StripWeapon("ix_nightvision")
end
if client:HasWeapon("ix_vortbeam") then
client:StripWeapon("ix_vortbeam")
end
if client:HasWeapon("ix_vortheal") then
client:StripWeapon("ix_vortheal")
end
if client:HasWeapon("ix_vshield") then
client:StripWeapon("ix_vshield")
end
if client:HasWeapon("ix_vortslam") then
client:StripWeapon("ix_vortslam")
end
if client:HasWeapon("ix_vortpyro") then
client:StripWeapon("ix_vortpyro")
end
if client:HasWeapon("ix_vortadvancedbeam") then
client:StripWeapon("ix_vortadvancedbeam")
end
end
end)
end
end
function PLUGIN:FirefightTurnStart(fight, fightInfo)
if (fightInfo.bVortShotLastTurn) then
fightInfo.turn.bNoVortShoot = true
fightInfo.bVortShotLastTurn = nil
end
end
local runSounds = {[0] = "NPC_Vortigaunt.FootstepLeft", [1] = "NPC_Vortigaunt.FootstepRight"}
function PLUGIN:PlayerFootstep(client, position, foot, soundName, volume)
if (client:IsVortigaunt()) then
client:EmitSound(runSounds[foot])
return true
end
end
function PLUGIN:CanButcherWithoutTool(client, entity, drop)
if (IsValid(client) and client:IsPlayer() and client:IsVortigaunt()) then
local weapon = client:GetActiveWeapon()
if (IsValid(weapon) and weapon:GetClass() == "ix_hands") then
return true
end
end
end
ix.log.AddType("vortessenceEntry", function(client, name)
return string.format("%s juste %s dans le menu vortessence.", client:SteamName(), name)
end)
function PLUGIN:OnPlayerObserve(client, state)
local broom = client.broomModel
if (broom and IsValid(broom)) then
if (state) then
broom:SetNoDraw(true)
else
broom:SetNoDraw(false)
end
end
end
-- CID GENERATION BY GRASS, IMPLEMENTED FOR VORT SHACKLES!!!
local prime = 99787 -- prime % 4 = 3! DO NOT CHANGE EVER
local offset = 320 -- slightly larger than sqrt(prime) is ok. DO NOT CHANGE EVER
local block = 1000
function PLUGIN:GenerateCollarID(id)
id = (id + offset) % prime
local cid = 0
local randomness = math.random(1, 1000)
for _ = 1, math.floor(id/block) do
cid = (cid + (id * block) % prime) % prime
end
cid = (cid + (id * (id % block) % prime)) % prime
if (2 * id < prime) then
return Schema:ZeroNumber(cid - randomness, 5)
else
return Schema:ZeroNumber(prime - cid - randomness, 5)
end
end