Compare commits

..

No commits in common. "master" and "v0.2-alpha" have entirely different histories.

17 changed files with 122 additions and 329 deletions

1
.gitignore vendored
View File

@ -2,7 +2,6 @@
## GMA compile output
######################
tmp/
builds/
*.gma
#############

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "tools/luasrcdiet"]
path = tools/luasrcdiet
url = https://github.com/LuaDist/luasrcdiet

View File

@ -1,8 +1,6 @@
Disguiser SWEP
==============
[![YouTube: [gmod] Derping around with the Disguiser ](http://img.youtube.com/vi/IvMkNIm4Ro0/0.jpg)](http://www.youtube.com/watch?v=IvMkNIm4Ro0&feature=github)
So you always wanted to be able to disguise as another item on the map in Sandbox or
any other game mode than Prop Hunt? You were always annoyed by how you were able to
see yourself being able to rotate but without knowing you were still standing all the

View File

@ -1,5 +1,8 @@
# Bugs
- (Severe) Can use non-studio models (example: *3)
=> Segmentation fault cause
# Optional fixes
- Item on cs_office needs correction (Which one, lol?)
@ -8,4 +11,3 @@
- Configuration via console vars
- Configuration via menusystem
- Move this TODO list completely to GitHub's issue tracker

View File

@ -1,16 +0,0 @@
{
"title" : "Disguiser SWEP",
"type" : "weapon",
"tags" : [ "fun", "comic" ],
"ignore" :
[
"*.git*",
"*.svn*",
"builds*",
"tools*",
"*.bat",
"*.sh",
"*.md",
"LICENSE.txt"
]
}

View File

@ -1,75 +0,0 @@
@echo off & setlocal enabledelayedexpansion
path %programfiles(x86)%\lua\5.1\;%path%;%programfiles(x86)%\Steam\SteamApps\common\GarrysMod\bin
if not exist builds mkdir builds
mkdir tmp
:: Root path
set workspace=%cd%
set workspacelentmp=%workspace%
set workspacelen=1
:workspacelencalc
set /a workspacelen=!workspacelen!+1
set workspace=!workspace:~1!
if "%workspace%"=="" goto compile
goto workspacelencalc
:compileerr
echo ERROR: Compilation failed.
exit /B -1
:compile
echo Workspace: %workspace% (%workspacelen%)
:: Compile LUA files
pushd lua
for /r %%i in (.) do (
set absdir=%%i
set directory=!absdir:~%workspacelen%,-2!
echo Creating !directory!...
mkdir "..\tmp\!directory!"
)
for /r %%i in (*.lua) do (
set absfile=%%i
set file=!absfile:~%workspacelen%!
echo Compiling !file!...
luac52 -o "..\tmp\!file!" "!absfile!"
if %errorlevel% NEQ 0 (
echo Could not compile !file!, only copying...
copy !absfile! "..\tmp\!file!"
)
)
popd
:: Optimize LUA files
::set cutofflen=
::set foo=%~dp0
:::_cl1
::if not "!foo!"=="" (
:: set /a cutofflen += 1
:: set foo=!foo:~1!
:: goto _cl1
::)
::for /R lua %%f in (*.lua) do (
:: set B=%%~ff
:: set B=!B:~%cutofflen%!
:: if not exist "!~dpB!" (
:: mkdir "!~dpB!"
:: )
:: echo Optimizing: !B!
:: pushd tools\luasrcdiet
:: LuaSrcDiet.lua ..\..\!B! --quiet -o ..\..\tmp\!B!
:: popd
::)
:: Copy over resources
robocopy . tmp *.json *.lua *.wav *.mp3 *.jpg *.png *.txt /MIR /XD tools /XD tmp /XF LICENSE.txt /NJH /NJS /NDL /NP /NS
:: Create the GMA file
gmad create -folder "tmp" -out "builds\disguiser_swep.gma"
:: Clean up
rmdir /q /s tmp
::pause

View File

@ -1,99 +0,0 @@
#!/bin/bash
reldir() {
# both $1 and $2 are absolute paths beginning with /
# returns relative path to $2/$target from $1/$source
source=$1
target=$2
common_part=$source # for now
result="" # for now
while [[ "${target#$common_part}" == "${target}" ]]; do
# no match, means that candidate common part is not correct
# go up one level (reduce common part)
common_part="$(dirname $common_part)"
# and record that we went back, with correct / handling
if [[ -z $result ]]; then
result=".."
else
result="../$result"
fi
done
if [[ $common_part == "/" ]]; then
# special case for root (no common path)
result="$result/"
fi
# since we now have identified the common part,
# compute the non-common part
forward_part="${target#$common_part}"
# and now stick all parts together
if [[ -n $result ]] && [[ -n $forward_part ]]; then
result="$result$forward_part"
elif [[ -n $forward_part ]]; then
# extra slash removal
result="${forward_part:1}"
fi
echo $result
}
copy_flt() {
filter="$3"
source="$1"
target="$2"
find "$source" -type "d" -not -path "$target" | while read i; do
mkdir -p "$target/$(reldir $source $i)"
done
find "$source" -name "$filter" -type "f" -not -path "$target" | while read i; do
cp "$i" "$target/$(reldir $source $i)"
done
}
mkdir -p builds
if [ -e tmp ]; then
rm -rf tmp
fi
mkdir -p tmp
# Root path
workspace=$(pwd)
echo Workspace: $workspace
# Copy over
copy_flt "." "tmp" "*.json"
copy_flt "." "tmp" "*.wav"
copy_flt "." "tmp" "*.lua"
copy_flt "." "tmp" "*.mp3"
copy_flt "." "tmp" "*.jpg"
copy_flt "." "tmp" "*.png"
copy_flt "." "tmp" "*.txt"
find tmp
# Compile LUA files
pushd lua
mkdir -p ../tmp/lua
find . -type f -name '*.lua' | while read absfile; do
file="lua/$absfile"
echo "Compiling $file..."
luac5.2 -o "../tmp/$file.luac" "$absfile" && (
rm "/tmp/$file"
mv "/tmp/$file.luac" "/tmp/$file"
) || (
echo "Could not compile $file, leaving as is."
)
done
popd
# Create the GMA file
gmad create -warninvalid -folder "tmp" -out "builds/disguiser_swep.gma"
# Clean up
rm -rf tmp

View File

@ -1,47 +1,48 @@
--
-- Disguiser SWEP - Lets you disguise as any prop on a map.
--
-- File:
-- patch_createfont.lua
--
-- Purpose:
-- This code will allow any font to be checked for existence. I hope it works
-- as it is only a function patch which should be loaded right at the beginning.
-- Can't guarantee that it loads right at the beginning though.
--
-- Copyright (C) 2013 Carl Kittelberger (Icedream)
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU Affero General Public License as
-- published by the Free Software Foundation, either version 3 of the
-- License, or (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU Affero General Public License for more details.
--
-- You should have received a copy of the GNU Affero General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
/**
* Disguiser SWEP - Lets you disguise as any prop on a map.
*
* File:
* patch_createfont.lua
*
* Purpose:
* This code will allow any font to be checked for existence. I hope it works
* as it is only a function patch which should be loaded right at the beginning.
* Can't guarantee that it loads right at the beginning though.
*
* Copyright (C) 2013 Carl Kittelberger (Icedream)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
print("[Disguiser] Loading compatibility layer for surface.CreateFont...")
local registered_fonts = {}
-- Function already patched by us?
if not surface.__createFont == nil then
// Function already patched by us?
if !!surface.__createFont then
MsgC(Color(255, 255, 0), "[Fontpatch] Can't patch surface.CreateFont, already patched. Skipping patch.\n")
return
end
-- Original function
// Original function
surface.__createFont = surface.CreateFont
-- Patch function
// Patch function
function surface.CreateFont(name, data)
if not name or not data then return false end
if !name || !data then return false end
if registered_fonts[name] then
if !!registered_fonts[name] then
MsgN("[Fontpatch] Skipping font " .. name .. ", already registered")
else
MsgN("[Fontpatch] Registering font " .. name .. "...")
@ -50,7 +51,7 @@ function surface.CreateFont(name, data)
surface.__createFont(name, data)
end
-- Check if a font exists
// Check if a font exists
function surface.FontExists(name)
return not not registered_fonts[name]
return !!registered_fonts[name] // I love how all those peeps on the internet still don't use the !! thingie
end

View File

@ -27,37 +27,34 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
hook.Add("CalcView", "Disguiser.ThirdPersonCalcView", function(ply, pos, angles, fov)
smoothscale = 1
hook.Add("CalcView", "Disguiser.ThirdPersonCalcView", function(player, pos, angles, fov)
local smoothscale = 1
if IsValid(ply) && ply:Alive() && ply:GetNetworkedBool("thirdperson") then
av = ply:GetAimVector()
if player:GetNetworkedBool("thirdperson") then
angles = player:GetAimVector():Angle()
if !av then return end
angles = av:Angle()
local targetpos = Vector(0, 0, ply:OBBMaxs().z)
if ply:KeyDown(IN_DUCK) then
if ply:GetVelocity():Length() > 0 then
local targetpos = Vector(0, 0, player:OBBMaxs().z)
if player:KeyDown(IN_DUCK) then
if player:GetVelocity():Length() > 0 then
targetpos.z = targetpos.z / 1.33
else
targetpos.z = targetpos.z / 2
end
end
ply:SetAngles(angles)
player:SetAngles(angles)
local targetfov = fov
if ply:GetVelocity():DotProduct(ply:GetForward()) > 10 then
if ply:KeyDown(IN_SPEED) then
targetpos = targetpos + ply:GetForward() * -10
if player:GetVelocity():DotProduct(player:GetForward()) > 10 then
if player:KeyDown(IN_SPEED) then
targetpos = targetpos + player:GetForward() * -10
else
targetpos = targetpos + ply:GetForward() * -5
targetpos = targetpos + player:GetForward() * -5
end
end
// smoothing - approaches a bit more slowly to the actual target position
pos = targetpos
pos = Vector(
math.Approach(pos.x, targetpos.x, math.abs(targetpos.x - pos.x) * smoothscale),
math.Approach(pos.y, targetpos.y, math.abs(targetpos.y - pos.y) * smoothscale),
@ -66,16 +63,16 @@ hook.Add("CalcView", "Disguiser.ThirdPersonCalcView", function(ply, pos, angles,
// offset it by the stored amounts, but trace so it stays outside walls
// we don't smooth this so the camera feels like its tightly following the mouse
local offset = Vector(50 + (ply:OBBMaxs().z - ply:OBBMins().z), 0, 10)
local offset = Vector(50 + (player:OBBMaxs().z - player:OBBMins().z), 0, 10)
local t = {
start = ply:GetPos() + pos,
endpos = (ply:GetPos() + pos)
start = player:GetPos() + pos,
endpos = (player:GetPos() + pos)
+ (angles:Forward() * -offset.x)
+ (angles:Right() * offset.y)
+ (angles:Up() * offset.z),
filter = ply
filter = player
}
if ply:GetVehicle():IsValid() then
if player:GetVehicle():IsValid() then
pos = t.endpos
else
local tr = util.TraceLine(t)
@ -86,22 +83,24 @@ hook.Add("CalcView", "Disguiser.ThirdPersonCalcView", function(ply, pos, angles,
end
// Smoothing FOV change
fov = targetfov -- comment or remove this to enable smoothing
fov = targetfov
fov = math.Approach(fov, targetfov, math.abs(targetfov - fov) * smoothscale)
return GAMEMODE:CalcView(ply, pos, angles, fov)
return GAMEMODE:CalcView(player, pos, angles, fov)
end
end)
hook.Add("HUDPaint", "Disguiser.ThirdPersonHUDPaint", function()
local ply = LocalPlayer()
local player = LocalPlayer()
if !player:GetNetworkedBool("thirdperson") then
return
end
if IsValid(ply) && !!ply["GetAimVector"] && ply:Alive() && ply:GetNetworkedBool("thirdperson") then
// trace from muzzle to hit pos
local t = {}
t.start = ply:GetShootPos()
t.endpos = t.start + ply:GetAimVector() * 9000
t.filter = ply
t.start = player:GetShootPos()
t.endpos = t.start + player:GetAimVector() * 9000
t.filter = player
local tr = util.TraceLine(t)
local pos = tr.HitPos:ToScreen()
local fraction = math.min((tr.HitPos - t.start):Length(), 1024) / 1024
@ -112,9 +111,9 @@ hook.Add("HUDPaint", "Disguiser.ThirdPersonHUDPaint", function()
// trace from camera to hit pos, if blocked, red crosshair
local tr = util.TraceLine({
start = ply:GetPos(),
start = player:GetPos(),
endpos = tr.HitPos + tr.HitNormal * 5,
filter = ply,
filter = player,
mask = MASK_SHOT
})
surface.SetDrawColor(255, 255, 255, 255)
@ -127,11 +126,10 @@ hook.Add("HUDPaint", "Disguiser.ThirdPersonHUDPaint", function()
surface.DrawLine(pos.x, pos.y + offset, pos.x, pos.y + offset2)
surface.DrawLine(pos.x - 1, pos.y, pos.x + 1, pos.y)
surface.DrawLine(pos.x, pos.y - 1, pos.x, pos.y + 1)
end
end)
hook.Add("HUDShouldDraw", "Disguiser.ThirdPersonHUDShouldDraw", function(name)
if name == "CHudCrosshair" and IsValid(LocalPlayer()) and LocalPlayer():Alive() and LocalPlayer():GetNetworkedBool("thirdperson") then
if name == "CHudCrosshair" and LocalPlayer():GetNetworkedInt("thirdperson") == 1 then
return false
end
end)

View File

@ -5,8 +5,9 @@
* cl_fxfake.lua
*
* Purpose:
* Fake client-side effects via a user message trigger from server-side, as for some
* reason these effects are not rendered on client-side automatically.
* Fake shoot effect on client-side via a trigger from server-side, as
* for some reason on multiplayer servers the effect is not rendered on
* client-side automatically.
*
* Copyright (C) 2013 Carl Kittelberger (Icedream)
*
@ -31,11 +32,10 @@ usermessage.Hook("disguiserShootFX", function(um)
local physbone = um:ReadLong()
local bFirstTimePredicted = um:ReadBool()
-- Can we trigger shoot effect yet?
swep = LocalPlayer():GetActiveWeapon()
if !swep.DoShootEffect then return false end
// Can we trigger shoot effect yet?
if !LocalPlayer():GetActiveWeapon().DoShootEffect then return false end
-- Render shoot effect
swep:DoShootEffect(
// Render shoot effect
LocalPlayer():GetActiveWeapon("disguiser"):DoShootEffect(
hitpos, hitnormal, entity, physbone, bFirstTimePredicted)
end)

View File

@ -105,9 +105,7 @@ function SWEP:Disguise(entity)
local owner = self.Owner
// Make sure we aren't already that model
if (owner:GetModel() == entity:GetModel()
&& owner:GetSkin() == entity:GetSkin()
&& owner:GetColor() == entity:GetColor()) then return true end
if (owner:GetModel() == entity:GetModel() && owner:GetSkin() == entity:GetSkin()) then return true end
// Make sure the new model is actually marked as a prop
if (
@ -127,6 +125,7 @@ function SWEP:Disguise(entity)
self.UndisguiseAsColor = owner:GetColor()
self.UndisguiseAsBloodColor = owner:GetBloodColor()
self.UndisguiseAsSolid = owner:GetSolid()
self.UndisguiseAsFullRotation = owner:GetAllowFullRotation()
end
// Disguise as given model
@ -149,7 +148,11 @@ function SWEP:Disguise(entity)
// Apply new hull
local obbmaxs = entity:OBBMaxs()
local obbmins = entity:OBBMins()
/*
local obbmargin = Vector(2, 2, 0)
obbmaxs = obbmaxs + obbmargin
obbmins = obbmins - obbmargin
*/
// Look for correction values
local pcfg = self:GetPropConfig(entity:GetModel())
if !!pcfg["OBBMaxsCorrection"] then
@ -209,6 +212,7 @@ function SWEP:Undisguise()
end
owner:SetColor(self.UndisguiseAsColor)
owner:SetSolid(self.UndisguiseAsSolid)
owner:SetAllowFullRotation(self.UndisguiseAsFullRotation) // up/down rotation
owner:SetBloodColor(self.UndisguiseAsBloodColor)
// Revert to old physics
@ -223,6 +227,7 @@ function SWEP:Undisguise()
umsg.End()
// Pop!
UndisguiseSilent()
owner:EmitSound("Disguiser.Undisguise")
// We're no longer disguised
@ -316,7 +321,6 @@ function SWEP:EnableThirdPerson(player)
entity:SetModel(player:GetModel())
entity:Spawn()
entity:SetAngles(player:GetAngles())
entity:SetVelocity(player:GetVelocity())
entity:SetMoveType(MOVETYPE_NONE)
entity:SetParent(player)
entity:SetOwner(player)
@ -329,35 +333,26 @@ function SWEP:EnableThirdPerson(player)
end
hook.Add("PlayerDeath", "Disguiser.ThirdPersonDeath", function(victim, inflictor, killer)
// Escape third-person mode
if victim:GetNWBool("thirdperson") then
victim:SetNetworkedBool("thirdperson", false)
local ventity = victim:GetViewEntity()
if (IsValid(ventity)) then
victim:SetViewEntity(victim)
ventity:Remove()
end
end
// Undisguise basically but with a few tweaks to avoid some bugs
if victim:GetNWBool("isDisguised") then
victim:SetNetworkedBool("isDisguised", false)
local ventity = victim:GetViewEntity()
// Escape third-person mode
if (IsValid(ventity)) then
ventity:Remove()
victim:SetViewEntity(victim)
end
if (!!victim.Disguised) then
// fake entity for spectacular death!
local dentity = ents.Create("prop_physics")
dentity:SetModel(victim:GetModel())
if !!victim:GetSkin() then
dentity:SetSkin(victim:GetSkin())
end
dentity:SetColor(victim:GetColor())
dentity:SetAngles(victim:GetAngles())
dentity:SetPos(victim:GetPos())
dentity:SetVelocity(victim:GetVelocity())
local physics = victim:GetPhysicsObject()
if !!victim:GetBloodColor() then
dentity:SetBloodColor(victim:GetBloodColor()) -- this thing was alive, ya know? :(
end
dentity:SetBloodColor(BLOOD_COLOR_RED) -- this thing was alive, ya know? :(
dentity:Spawn()
local dphysics = dentity:GetPhysicsObject()
dphysics:SetAngles(physics:GetAngles())
@ -365,14 +360,13 @@ hook.Add("PlayerDeath", "Disguiser.ThirdPersonDeath", function(victim, inflictor
dphysics:SetDamping(physics:GetDamping())
dphysics:SetInertia(physics:GetInertia())
dentity:Fire("break", "", 0)
dentity:Fire("kill", "", 1)
dentity:Fire("kill", "", 2)
dentity:Fire("enablemotion","",0)
// Let the entity bleed wahahaha. I'm mad, ain't I?
// Manually draw additional blood (for some reason setting the blood color has no effect)
local traceworld = {}
traceworld.start = victim:GetPos() + Vector(0, 0, 20)
traceworld.endpos = traceworld.start + (Vector(0,0,-1) * 8000) // aim max. 8000 units down
traceworld.filter = victim
local trw = util.TraceLine(traceworld) // Send the trace and get the results.
local edata = EffectData()
edata:SetStart(victim:GetPos() - physics:GetVelocity())
@ -380,12 +374,7 @@ hook.Add("PlayerDeath", "Disguiser.ThirdPersonDeath", function(victim, inflictor
edata:SetNormal(trw.Normal)
edata:SetEntity(dentity)
util.Effect("BloodImpact", edata)
// Reset the victim's bounding box to solve the issue with getting stuck at spawn
victim:ResetHull()
umsg.Start("resetHull", victim)
umsg.Entity(victim)
umsg.End()
util.Decal("Splash.Large", trw.HitPos + trw.HitNormal, trw.HitPos - trw.HitNormal)
end
end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -1 +0,0 @@
Subproject commit 486129fa1ef1539071d14a366d686f3892c3d43f