updates in preparations for beta
changed deleteonremove to use new system in welds instead massive updates to adv duplicator. now separate module and addon include modified weight stool that support duplication lots of other shit
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
"AddonInfo"
|
||||
{
|
||||
"name" "Wire"
|
||||
"version" "0.9.5"
|
||||
"up_date" "4th February 2007"
|
||||
"version" "0.9.6"
|
||||
"up_date" "24st March 2007"
|
||||
"author_name" "Wire Team"
|
||||
"author_email" "ErkleMad@gmail.com"
|
||||
"author_url" "http://www.gmodforge.com/projects/wire/"
|
||||
"author_url" "http://www.wiremod.com/"
|
||||
"info" "A set of SEnts and STools that communicate through wires."
|
||||
"override" "0"
|
||||
}
|
||||
|
||||
@@ -1,252 +1 @@
|
||||
if (CLIENT) then
|
||||
|
||||
duplicatorclient={}
|
||||
|
||||
include( "autorun/shared/dupeshare.lua" )
|
||||
|
||||
function duplicatorclient.UpLoadFile( pl, filepath )
|
||||
|
||||
if (duplicatorclient.sending) then return end
|
||||
if !file.Exists(filepath)then print("File not found") return end
|
||||
|
||||
local filename = dupeshare.GetFileFromFilename(filepath)
|
||||
|
||||
//load from file
|
||||
local temp = file.Read(filepath)
|
||||
|
||||
//shitty string protection/compression
|
||||
//duplicatorclient.temp2 = string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(temp,"\t\t\"__name\"\t\t","|mn"),"\t\t\"__type\"\t\t","|mt"),"\t\t\t\"V\"\t\t","|mv|"),"\t\t\t\"DupeInfo\"","|mD"),"\"Number\"\n","|mN"),"\"String\"\n","|mS"),"\"Angle\"\n","|mA"),"\"Vector\"\n","|mV"),"\"Bool\"\n","|mB"),"\"Class\"","|mC"),"\"material\"","|mm"),"\"prop_physics\"","|mp"),"\t\t\"VersionInfo\"\n\t\t\"FileVersion\"\n\t\t{\n","|VI"),"\"models","|wm"),"\n\t\t\t\"NoCollide\"\n\t\t\t{\n\t","|NC"),"\"nocollide\"\n","|nc"),"\"HeadEntID\"\n","|HE"),"\n\t}\n\t\"holdangle\"\n\t{\n","|ha"),"\t\t\"Y\"\t\t\"","|qY"),"\t\t\"z\"\t\t\"","|qz"),"\t\t\"x\"\t\t\"","|qx"),"\t\t\"A\"\t\t\"","|qA"),"\t\t\"B\"\t\t\"","|qB"),"\t\t\"g\"\t\t\"","|qg"),"\t\t\"r\"\t\t\"","|qr"),"\t\t\"p\"\t\t\"","|qp"),"\"HoldAngle\"\n","|HA"),"\n","|n"),"\t\t\t\t","|4t"),"\t\t\t","|3t"),"\t\t","|2t"),"\t","|t"),"name","|N"),"\"","|Q")
|
||||
|
||||
duplicatorclient.temp2 = dupeshare.Compress(temp, true)
|
||||
|
||||
//this is where we send the data to the serer
|
||||
local len = string.len(duplicatorclient.temp2)
|
||||
local last = math.ceil(len / 250)
|
||||
|
||||
pl:ConCommand("DupeRecieveFileContentStart "..tostring(last).." \""..string.gsub(filename,".txt","").."\"")
|
||||
|
||||
timer.Simple( 0.2, duplicatorclient.SendSaveDataToServer, len, 1, last )
|
||||
|
||||
duplicatorclient.sending = true
|
||||
end
|
||||
|
||||
|
||||
function duplicatorclient.SendSaveDataToServer(len, offset, last)
|
||||
|
||||
if (offset <= last) then
|
||||
Msg("sending string: "..tostring(offset * 250).." / "..len.." piece: "..offset.." / "..last.."\n")
|
||||
|
||||
local str = ""
|
||||
if (offset == last) then
|
||||
local pos = (len - ((last - 1) * 250))
|
||||
str = string.Right(duplicatorclient.temp2, pos)
|
||||
Msg("last str len: "..tostring(string.len(str)).."\n")
|
||||
else
|
||||
str = string.Right(string.Left(duplicatorclient.temp2, (offset * 250)),250)
|
||||
end
|
||||
LocalPlayer():ConCommand("_DFC "..tostring(offset).." \""..str.."\"")
|
||||
end
|
||||
|
||||
if (offset + 1) <= last then
|
||||
//send slowly or the server will boot player or just crash
|
||||
timer.Simple( 0.1, duplicatorclient.SendSaveDataToServer, len, (offset + 1), last )
|
||||
else
|
||||
timer.Simple( 0.5,
|
||||
function()
|
||||
LocalPlayer():ConCommand("DupeRecieveFileContentFinish")
|
||||
duplicatorclient.temp2 = ""
|
||||
end
|
||||
)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local function SendFinished( um )
|
||||
duplicatorclient.sending = false
|
||||
end
|
||||
usermessage.Hook("ClientSendFinished", SendFinished)
|
||||
|
||||
|
||||
local function ClientRecieveSaveStart( um )
|
||||
Msg("========= ClientRecieveSaveStart ==========\n")
|
||||
duplicatorclient.temp = {}
|
||||
duplicatorclient.temp.piece = {}
|
||||
|
||||
duplicatorclient.temp.numofpieces = um:ReadShort()
|
||||
duplicatorclient.temp.filename = um:ReadString()
|
||||
duplicatorclient.temp.dir = um:ReadString()
|
||||
|
||||
duplicatorclient.temp.recievedpieces = 0
|
||||
|
||||
Msg("NumToRecieve= "..duplicatorclient.temp.numofpieces.."\n==========\n")
|
||||
end
|
||||
usermessage.Hook("RecieveSaveStart", ClientRecieveSaveStart)
|
||||
|
||||
local function ClientRecieveSaveData( um )
|
||||
local piece = um:ReadShort()
|
||||
local temp = um:ReadString()
|
||||
duplicatorclient.temp.recievedpieces = duplicatorclient.temp.recievedpieces + 1
|
||||
|
||||
Msg("getting file data, piece: "..piece.." of "..duplicatorclient.temp.numofpieces.."\n")
|
||||
|
||||
duplicatorclient.temp.piece[piece] = temp
|
||||
|
||||
if (duplicatorclient.temp.recievedpieces >= duplicatorclient.temp.numofpieces) then
|
||||
Msg("recieved last piece\n")
|
||||
LocalPlayer():ConCommand("adv_duplicator_clientsavefile")
|
||||
end
|
||||
end
|
||||
usermessage.Hook("RecieveSaveData", ClientRecieveSaveData)
|
||||
|
||||
local function ClientSaveFile()
|
||||
|
||||
local filepath, filename = duplicatorclient.FileNoOverWriteCheck( duplicatorclient.temp.dir, duplicatorclient.temp.filename )
|
||||
|
||||
//reassemble the pieces
|
||||
local temp = ""
|
||||
for k, v in pairs(duplicatorclient.temp.piece) do
|
||||
temp = temp .. v
|
||||
end
|
||||
|
||||
//temp = string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(string.gsub(temp,"|mn","\t\t\"__name\"\t\t"),"|mt","\t\t\"__type\"\t\t"),"|mv|","\t\t\t\"V\"\t\t"),"|mD","\t\t\t\"DupeInfo\""),"|mN","\"Number\"\n"),"|mS","\"String\"\n"),"|mA","\"Angle\"\n"),"|mV","\"Vector\"\n"),"|mB","\"Bool\"\n"),"|mC","\"Class\""),"|mm","\"material\""),"|mp","\"prop_physics\""),"|VI","\t\t\"VersionInfo\"\n\t\t\"FileVersion\"\n\t\t{\n"),"|wm","\"models"),"|NC","\n\t\t\t\"NoCollide\"\n\t\t\t{\n\t"),"|nc","\"nocollide\"\n"),"|HE","\"HeadEntID\"\n"),"|ha","\n\t}\n\t\"holdangle\"\n\t{\n"),"|qY","\t\t\"Y\"\t\t\""),"|qz","\t\t\"z\"\t\t\""),"|qx","\t\t\"x\"\t\t\""),"|qA","\t\t\"A\"\t\t\""),"|qB","\t\t\"B\"\t\t\""),"|qg","\t\t\"g\"\t\t\""),"|qr","\t\t\"r\"\t\t\""),"|qp","\t\t\"p\"\t\t\""),"|HA","\"HoldAngle\"\n"),"|4","\t\t\t\t"),"|3","\t\t\t"),"|N","name")
|
||||
|
||||
temp = dupeshare.DeCompress(temp, false)
|
||||
|
||||
file.Write(filepath, temp)
|
||||
|
||||
Msg("Your file: \""..filepath.."\" was saved form the server\n")
|
||||
Msg("Your file: \""..filename.."\" was saved form the server\n")
|
||||
|
||||
LocalPlayer():ConCommand("adv_duplicator_updatelist")
|
||||
|
||||
end
|
||||
concommand.Add( "adv_duplicator_clientsavefile", ClientSaveFile )
|
||||
|
||||
|
||||
|
||||
|
||||
/*---------------------------------------------------------
|
||||
functions for clients from server side duplicator.lua
|
||||
---------------------------------------------------------*/
|
||||
/*---------------------------------------------------------
|
||||
Name: duplicatorclient.PrepareTableToSave( table )
|
||||
Desc: Converts a table in to a lot tables to protect
|
||||
vectors, angles, bools, numbers, and indexes
|
||||
from being horribly raped by TableToKeyValues
|
||||
---------------------------------------------------------*/
|
||||
function duplicatorclient.PrepareTableToSave( t, done)
|
||||
|
||||
local done = done or {}
|
||||
local tbl = {}
|
||||
|
||||
for k, v in pairs ( t ) do
|
||||
if ( type( v ) == "table" and !done[ v ] ) then
|
||||
done[ v ] = true
|
||||
tbl[ k ] = duplicatorclient.PrepareTableToSave ( v, done )
|
||||
tbl[k].__name = k
|
||||
else
|
||||
if ( type(v) == "Vector" ) then
|
||||
local x, y, z = v.x, v.y, v.z
|
||||
if y == 0 then y = nil end
|
||||
if z == 0 then z = nil end
|
||||
tbl[k] = { __type = "Vector", x = x, y = y, z = z, __name = k }
|
||||
elseif ( type(v) == "Angle" ) then
|
||||
local p,y,r = v.pitch, v.yaw, v.roll
|
||||
if p == 0 then p = nil end
|
||||
if y == 0 then y = nil end
|
||||
if r == 0 then r = nil end
|
||||
tbl[k] = { __type = "Angle", p = p, y = y, r = r, __name = k }
|
||||
elseif ( type(v) == "boolean" ) then
|
||||
tbl[k] = { __type = "Bool", v = tostring( v ), __name = k }
|
||||
elseif ( type(v) == "number" ) then
|
||||
tbl[k] = { __type = "Number", v = tostring( v ), __name = k }
|
||||
else
|
||||
tbl[k] = { __type = "String", v = tostring( v ), __name = k }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return tbl
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: duplicatorclient.RebuildTableFromLoad( table )
|
||||
Desc: Removes the protection added by PrepareTableToSave
|
||||
after table is loaded with KeyValuesToTable
|
||||
---------------------------------------------------------*/
|
||||
function duplicatorclient.RebuildTableFromLoad( t, done )
|
||||
|
||||
local done = done or {}
|
||||
local tbl = {}
|
||||
|
||||
for k, v in pairs ( t ) do
|
||||
if ( type( v ) == "table" and !done[ v ] ) then
|
||||
done[ v ] = true
|
||||
if ( v.__type ) then
|
||||
if ( v.__type == "Vector" ) then
|
||||
tbl[ v.__name ] = Vector( v.x, v.y, v.z )
|
||||
elseif ( v.__type == "Angle" ) then
|
||||
tbl[ v.__name ] = Angle( v.p, v.y, v.r )
|
||||
elseif ( v.__type == "Bool" ) then
|
||||
tbl[ v.__name ] = util.tobool( v.v )
|
||||
elseif ( v.__type == "Number" ) then
|
||||
tbl[ v.__name ] = tonumber( v.v )
|
||||
elseif ( v.__type == "String" ) then
|
||||
tbl[ v.__name ] = tostring( v.v )
|
||||
end
|
||||
else
|
||||
tbl[ v.__name ] = duplicatorclient.RebuildTableFromLoad ( v, done )
|
||||
end
|
||||
else
|
||||
if k != "__name" then //don't add the table names to output
|
||||
tbl[ k ] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return tbl
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: duplicatorclient.FileNoOverWriteCheck( dir, filename )
|
||||
Desc: Check if dir and filename exist and if so renames
|
||||
returns filepath (dir.."/"..filename..".txt")
|
||||
---------------------------------------------------------*/
|
||||
function duplicatorclient.FileNoOverWriteCheck( dir, filename )
|
||||
|
||||
if !file.Exists(dir) then
|
||||
file.CreateDir(dir)
|
||||
elseif !file.IsDir(dir) then
|
||||
local x = 0
|
||||
while x ~= nil do
|
||||
x = x + 1
|
||||
if not file.Exists(dir.."_"..tostring(x)) then
|
||||
dir = dir.."_"..tostring(x)
|
||||
file.CreateDir(dir)
|
||||
x = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if file.Exists(dir .. "/" .. filename .. ".txt") then
|
||||
local x = 0
|
||||
while x ~= nil do
|
||||
x = x + 1
|
||||
if not file.Exists(dir.."/"..filename.."_"..tostring(x)..".txt") then
|
||||
filename = filename.."_"..tostring(x)
|
||||
x = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local filepath = dir .. "/" .. filename .. ".txt"
|
||||
|
||||
return filepath, filename, dir
|
||||
end
|
||||
|
||||
|
||||
|
||||
Msg("--- Wire duplicator client module installed! ---\n")
|
||||
|
||||
end
|
||||
//this file left blank on purpose to overwrite existing file on upgrade
|
||||
@@ -4,6 +4,7 @@
|
||||
local meta = FindMetaTable("Entity")
|
||||
if (!meta) then return end
|
||||
|
||||
/*not need any more
|
||||
if (!oldDORFunction) then
|
||||
oldDORFunction = meta.DeleteOnRemove
|
||||
|
||||
@@ -46,7 +47,7 @@ function meta:GetDeleteOnRemoveInfo()
|
||||
end
|
||||
|
||||
return DORInfo
|
||||
end
|
||||
end*/
|
||||
|
||||
//Set DeleteOnRemoveInfo
|
||||
function meta:SetDeleteOnRemoveInfo(DORInfo, GetEntID)
|
||||
@@ -67,7 +68,7 @@ function meta:SetDeleteOnRemoveInfo(DORInfo, GetEntID)
|
||||
end
|
||||
|
||||
// Console Command to print EntIndex() of all attached ents
|
||||
local function PrintDOREntities(player,command,arguments)
|
||||
/*local function PrintDOREntities(player,command,arguments)
|
||||
local trace = player:GetEyeTrace()
|
||||
if (!trace.HitPos || !trace.Entity || !trace.Entity:IsValid() || trace.Entity:IsPlayer()) then return end
|
||||
if (!trace.Entity.DeleteOnRemoveInfo) then return end
|
||||
@@ -80,4 +81,4 @@ local function PrintDOREntities(player,command,arguments)
|
||||
Msg(index..": "..ent:EntIndex().."\n")
|
||||
end
|
||||
end
|
||||
concommand.Add("dor_entities",PrintDOREntities)
|
||||
concommand.Add("dor_entities",PrintDOREntities)*/
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -504,3 +504,10 @@ function Wire_CreateOutputIterator()
|
||||
|
||||
return iter
|
||||
end
|
||||
|
||||
|
||||
function Wire_AfterPasteMods(ply, Ent, DupeInfo)
|
||||
//this does nothing for now, we need the blank function to get the duplicator to copy the WireDupeInfo into the pasted ent
|
||||
end
|
||||
duplicator.RegisterEntityModifier( "WireDupeInfo", Wire_AfterPasteMods )
|
||||
|
||||
|
||||
@@ -1,385 +1 @@
|
||||
|
||||
dupeshare = {}
|
||||
|
||||
|
||||
dupeshare.Dictionary = {
|
||||
[1] = {"|MCl", "\"\n\t\t\t}\n\t\t\t\"class\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"Class\"\n\t\t\t\t\"__type\"\t\t\"String\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[2] = {"|Mfz", "\"\n\t\t\t}\n\t\t\t\"frozen\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"frozen\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[3] = {"|Mre", "\"\n\t\t\t}\n\t\t\t\"resistance\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"resistance\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[4] = {"|Msp", "\"\n\t\t\t}\n\t\t\t\"speed\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"speed\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[5] = {"|Mkd", "\"\n\t\t\t}\n\t\t\t\"key_d\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"key_d\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[6] = {"|Mnc", "\"\n\t\t\t}\n\t\t\t\"NoCollide\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"nocollide\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[7] = {"|Mdm", "\"\n\t\t\t}\n\t\t\t\"damageable\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"damageable\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[8] = {"|Mkb", "\"\n\t\t\t}\n\t\t\t\"key_bck\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"key_bck\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[9] = {"|Mfr", "\"\n\t\t\t}\n\t\t\t\"force\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"force\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[10] = {"|Mky", "\"\n\t\t\t}\n\t\t\t\"key\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"key\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[11] = {"|Mmd", "\"\n\t\t\t}\n\t\t\t\"model\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"model\"\n\t\t\t\t\"__type\"\t\t\"String\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[12] = {"|Mtg", "\"\n\t\t\t}\n\t\t\t\"toggle\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"toggle\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[13] = {"|Mef", "\"\n\t\t\t}\n\t\t\t\"effect\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"effect\"\n\t\t\t\t\"__type\"\t\t\"String\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[14] = {"|ME1", "\"\n\t\t\t}\n\t\t\t\"Ent1\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"Ent1\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[15] = {"|ME2", "\"\n\t\t\t}\n\t\t\t\"Ent2\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"Ent2\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[16] = {"|MB1", "\"\n\t\t\t}\n\t\t\t\"Bone1\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"Bone1\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[17] = {"|MB2", "\"\n\t\t\t}\n\t\t\t\"Bone2\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"Bone2\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[18] = {"|Mtl", "\"\n\t\t\t}\n\t\t\t\"torquelimit\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"torquelimit\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[19] = {"|Mty", "\"\n\t\t\t}\n\t\t\t\"type\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"Type\"\n\t\t\t\t\"__type\"\t\t\"String\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[20] = {"|Mfl", "\"\n\t\t\t}\n\t\t\t\"forcelimit\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"forcelimit\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[21] = {"|Mln", "\"\n\t\t\t}\n\t\t\t\"length\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"length\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[22] = {"|MCI", "\"\n\t\t\t}\n\t\t\t\"ConstID\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"ConstID\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[23] = {"|Mwd", "\"\n\t\t\t}\n\t\t\t\"width\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"width\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[24] = {"|Mrg", "\"\n\t\t\t}\n\t\t\t\"rigid\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"rigid\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[25] = {"|Mmt", "\"\n\t\t\t}\n\t\t\t\"material\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"material\"\n\t\t\t\t\"__type\"\t\t\"String\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[26] = {"|Mal", "\"\n\t\t\t}\n\t\t\t\"addlength\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"addlength\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[27] = {"|MFI", "\"\n\t\t\t}\n\t\t\t\"FileInfo\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"FileInfo\"\n\t\t\t\t\"__type\"\t\t\"String\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[28] = {"|MND", "\"\n\t\t\t}\n\t\t\t\"NumOfDupeInfo\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"NumOfDupeInfo\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[29] = {"|MNE", "\"\n\t\t\t}\n\t\t\t\"NumOfEnts\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"NumOfEnts\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[30] = {"|MNC", "\"\n\t\t\t}\n\t\t\t\"NumOfConst\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"NumOfConst\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[31] = {"|MCr", "\"\n\t\t\t}\n\t\t\t\"Creator\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"Creator\"\n\t\t\t\t\"__type\"\t\t\"String\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[32] = {"|MDc", "\"\n\t\t\t}\n\t\t\t\"Desc\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"Desc\"\n\t\t\t\t\"__type\"\t\t\"String\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[33] = {"|Mop", "\"\n\t\t\t}\n\t\t\t\"out_pos\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"out_pos\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[34] = {"|Miw", "\"\n\t\t\t}\n\t\t\t\"ignore_world\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"ignore_world\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[35] = {"|Mdz", "\"\n\t\t\t}\n\t\t\t\"default_zero\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"default_zero\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[36] = {"|Msb", "\"\n\t\t\t}\n\t\t\t\"show_beam\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"show_beam\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[37] = {"|Moa", "\"\n\t\t\t}\n\t\t\t\"out_ang\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"out_ang\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[38] = {"|Mtw", "\"\n\t\t\t}\n\t\t\t\"trace_water\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"trace_water\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[39] = {"|Mov", "\"\n\t\t\t}\n\t\t\t\"out_vel\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"out_vel\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[40] = {"|Moc", "\"\n\t\t\t}\n\t\t\t\"out_col\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"out_col\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[41] = {"|Moa", "\"\n\t\t\t}\n\t\t\t\"out_val\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"out_val\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[42] = {"|Mod", "\"\n\t\t\t}\n\t\t\t\"out_dist\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"out_dist\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[43] = {"|Mbd", "\"\n\t\t\t}\n\t\t\t\"doblastdamage\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"doblastdamage\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[44] = {"|Mra", "\"\n\t\t\t}\n\t\t\t\"removeafter\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"removeafter\"\n\t\t\t\t\"__type\"\t\t\"Bool\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[45] = {"|Mrd", "\"\n\t\t\t}\n\t\t\t\"radius\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"radius\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[46] = {"|Mat", "\"\n\t\t\t}\n\t\t\t\"action\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"action\"\n\t\t\t\t\"__type\"\t\t\"String\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[47] = {"|Mkg", "\n\t\t\t\"keygroup\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"keygroup\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[48] = {"|Mvo", "\"\n\t\t\t}\n\t\t\t\"value_off\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"value_off\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[49] = {"|Mvn", "\"\n\t\t\t}\n\t\t\t\"value_on\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"value_on\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[50] = {"|MAa", "\"\n\t\t\t}\n\t\t\t\"A\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"a\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[51] = {"|MBb", "\"\n\t\t\t}\n\t\t\t\"B\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"b\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[52] = {"|Mab", "\"\n\t\t\t}\n\t\t\t\"ab\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"ab\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[53] = {"|Maa", "\"\n\t\t\t}\n\t\t\t\"aa\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"aa\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[54] = {"|Mag", "\"\n\t\t\t}\n\t\t\t\"ag\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"ag\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[55] = {"|Mbg", "\"\n\t\t\t}\n\t\t\t\"bg\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"bg\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[56] = {"|Mba", "\"\n\t\t\t}\n\t\t\t\"ba\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"ba\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[57] = {"|Mbb", "\"\n\t\t\t}\n\t\t\t\"bb\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"bb\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[58] = {"|Mar", "\"\n\t\t\t}\n\t\t\t\"ar\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"ar\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[59] = {"|Mbr", "\"\n\t\t\t}\n\t\t\t\"br\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"br\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[60] = {"|MVe", "\"\n\t\t\t}\n\t\t\t\"Vel\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"Vel\"\n\t\t\t\t\"__type\"\t\t\"Vector\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[61] = {"|MaV", "\"\n\t\t\t}\n\t\t\t\"aVel\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"aVel\"\n\t\t\t\t\"__type\"\t\t\"Vector\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[62] = {"|MSm", "\"\n\t\t\t}\n\t\t\t\"Smodel\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"Smodel\"\n\t\t\t\t\"__type\"\t\t\"String\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[63] = {"|MWw", "\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\"width\"\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"__name\"\t\t\"Width\"\n\t\t\t\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\t\t\t\"V\"\t\t\""},
|
||||
[64] = {"|MWS", "\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\"Src\"\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"__name\"\t\t\"Src\"\n\t\t\t\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\t\t\t\"V\"\t\t\""},
|
||||
[65] = {"|MWI", "\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\"SrcId\"\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"__name\"\t\t\"SrcId\"\n\t\t\t\t\t\t\t\"__type\"\t\t\"String\"\n\t\t\t\t\t\t\t\"V\"\t\t\""},
|
||||
[66] = {"|MWm", "\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\"material\"\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"__name\"\t\t\"material\"\n\t\t\t\t\t\t\t\"__type\"\t\t\"String\"\n\t\t\t\t\t\t\t\"V\"\t\t\""},
|
||||
[67] = {"|MWD", "\"\n\t\t\t}\n\t\t\t\"DupeInfo\"\n\t\t\t{\n\t\t\t\t\"__name\"\t\t\"DupeInfo\"\n\t\t\t\t\"Wires\"\n\t\t\t\t{\n\t\t\t\t\t\"A\"\n\t\t\t\t\t{\n\t\t\t\t\t\t\"__name\"\t\t\"A\"\n\t\t\t\t\t\t\"SrcPos\"\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"Y\"\t\t\""},
|
||||
[68] = {"|MWB", "\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\"B\"\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"__name\"\t\t\"b\"\n\t\t\t\t\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\t\t\t\t\"V\"\t\t\""},
|
||||
[69] = {"|MWg", "\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\"g\"\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"__name\"\t\t\"g\"\n\t\t\t\t\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\t\t\t\t\"V\"\t\t\""},
|
||||
[70] = {"|MWr", "\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\"r\"\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\"__name\"\t\t\"r\"\n\t\t\t\t\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\t\t\t\t\"V\"\t\t\""},
|
||||
[71] = {"|mn", "\t\t\"__name\"\t\t"},
|
||||
[72] = {"|mt", "\t\t\"__type\"\t\t"},
|
||||
[73] = {"|mv", "\t\t\t\"V\"\t\t"},
|
||||
[74] = {"|mD", "\t\t\t\"DupeInfo\""},
|
||||
[75] = {"|mN", "\"Number\"\n"},
|
||||
[76] = {"|mS", "\"String\"\n"},
|
||||
[77] = {"|mA", "\"Angle\"\n"},
|
||||
[78] = {"|mV", "\"Vector\"\n"},
|
||||
[79] = {"|mB", "\"Bool\"\n"},
|
||||
[80] = {"|mC", "\"Class\""},
|
||||
[81] = {"|mm", "\"material\""},
|
||||
[82] = {"|mp", "\"prop_physics\""},
|
||||
[83] = {"|VI", "\t\t\"VersionInfo\"\n\t\t\"FileVersion\"\n\t\t{\n\t\t\t\t\"__name\"\t\t\"FileVersion\"\n\t\t\t\t\"__type\"\t\t\"Number\"\n\t\t\t\t\"V\"\t\t\""},
|
||||
[84] = {"|wm", "\"models"},
|
||||
[85] = {"|nC", "\n\t\t\t\"NoCollide\"\n\t\t\t{\n\t"},
|
||||
[86] = {"|nc", "\"nocollide\"\n"},
|
||||
[87] = {"|HE", "\"HeadEntID\"\n"},
|
||||
[88] = {"|ha", "\n\t}\n\t\"holdangle\"\n\t{\n"},
|
||||
[89] = {"|qY", "\t\t\"Y\"\t\t\""},
|
||||
[90] = {"|qz", "\t\t\"z\"\t\t\""},
|
||||
[91] = {"|qx", "\t\t\"x\"\t\t\""},
|
||||
[92] = {"|qA", "\t\t\"A\"\t\t\""},
|
||||
[93] = {"|qB", "\t\t\"B\"\t\t\""},
|
||||
[94] = {"|qg", "\t\t\"g\"\t\t\""},
|
||||
[95] = {"|qr", "\t\t\"r\"\t\t\""},
|
||||
[96] = {"|qp", "\t\t\"p\"\t\t\""},
|
||||
[97] = {"|HA", "\"HoldAngle\"\n"},
|
||||
[98] = {"|5", "\t\t\t\t\t"},
|
||||
[98] = {"|4", "\t\t\t\t"},
|
||||
[99] = {"|3", "\t\t\t"},
|
||||
[100] = {"|2", "\t\t"},
|
||||
[101] = {"|N", "name"},
|
||||
}
|
||||
|
||||
function dupeshare.Compress(str, ForConCommand)
|
||||
|
||||
local beforelen = string.len(str)
|
||||
|
||||
for k=1,101 do
|
||||
local entry = dupeshare.Dictionary[k]
|
||||
str = string.gsub(str, entry[2], entry[1])
|
||||
end
|
||||
|
||||
if (ForConCommand) then //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> unused special chars
|
||||
str = string.gsub(string.gsub(string.gsub(str,"<EFBFBD>","|<7C>"),"<EFBFBD>","|<7C>"),"<EFBFBD>","|<7C>") //incase it has any of these...
|
||||
str = string.gsub(string.gsub(string.gsub(str,"\n","<EFBFBD>"),"\t","<EFBFBD>"),"\"","<EFBFBD>")
|
||||
end
|
||||
|
||||
local afterlen = string.len(str)
|
||||
Msg("String Compressed: "..afterlen.." / "..beforelen.." ratio: "..(afterlen / beforelen).."%\n")
|
||||
|
||||
return str
|
||||
|
||||
end
|
||||
|
||||
function dupeshare.DeCompress(str, FormConCommand)
|
||||
|
||||
local afterlen = string.len(str)
|
||||
|
||||
for k=101,1,-1 do
|
||||
local entry = dupeshare.Dictionary[k]
|
||||
str = string.gsub(str, entry[1], entry[2])
|
||||
end
|
||||
|
||||
if (FormConCommand) then
|
||||
str = string.gsub(string.gsub(string.gsub(str,"|<7C>","<EFBFBD>"),"|<7C>","<EFBFBD>"),"|<7C>","<EFBFBD>")
|
||||
str = string.gsub(string.gsub(string.gsub(str,"<EFBFBD>","\n"),"<EFBFBD>","\t"),"<EFBFBD>","\"")
|
||||
end
|
||||
|
||||
local beforelen = string.len(str)
|
||||
Msg("String Decompressed: "..afterlen.." / "..beforelen.." ratio: "..(afterlen / beforelen).."%\n")
|
||||
|
||||
return str
|
||||
|
||||
end
|
||||
|
||||
|
||||
dupeshare.BadChars = {"\\", "/", ":", "*", "?", "\"", "<", ">", "<EFBFBD>", "|"}
|
||||
|
||||
function dupeshare.ReplaceBadChar(str)
|
||||
for _,entry in pairs(dupeshare.BadChars) do
|
||||
str = string.gsub(str, entry, "_")
|
||||
end
|
||||
return str
|
||||
end
|
||||
|
||||
|
||||
if (CLIENT) then
|
||||
|
||||
LocalPlayer():ConCommand("GiveMeSteamID")
|
||||
|
||||
local function GetSteamID( um )
|
||||
dupeshare.MySteamID = um:ReadString()
|
||||
Msg("My SteamID is: "..(dupeshare.MySteamID or "NIL").."\n")
|
||||
end
|
||||
usermessage.Hook("GivePlayerSteamID", GetSteamID)
|
||||
|
||||
function dupeshare.GetPlayerName(pl)
|
||||
local name = dupeshare.MySteamID or pl:GetName() or "unknown"
|
||||
if (name == "STEAM_ID_LAN") or (name == "UNKNOWN") or (name == "STEAM_ID_PENDING") then
|
||||
name = pl:GetName() or "unknown"
|
||||
end
|
||||
name = dupeshare.ReplaceBadChar(name)
|
||||
return name
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if (SERVER) then
|
||||
|
||||
if (!SinglePlayer()) then
|
||||
local function GivePlayerTheirSteamID( pl, cmd, args )
|
||||
umsg.Start("GivePlayerSteamID", pl)
|
||||
umsg.String(pl:SteamID())
|
||||
Msg("Player \""..tostring(pl:GetName()).."\" SteamID is: "..pl:SteamID().."\n")
|
||||
umsg.End()
|
||||
end
|
||||
concommand.Add("GiveMeSteamID", GivePlayerTheirSteamID)
|
||||
end
|
||||
|
||||
function dupeshare.GetPlayerName(pl)
|
||||
local name = pl:SteamID() or pl:GetName() or "unknown"
|
||||
if (name == "STEAM_ID_LAN") or (name == "UNKNOWN") or (name == "STEAM_ID_PENDING") then
|
||||
name = pl:GetName() or "unknown"
|
||||
end
|
||||
name = dupeshare.ReplaceBadChar(name)
|
||||
return name
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
function dupeshare.CurrentToolIsDuplicator(tool, advdupeonly)
|
||||
if (tool) and (tool:GetClass() == "gmod_tool" )
|
||||
and ((tool:GetTable():GetToolObject().Name == "Advanced Duplicator")
|
||||
or ((tool:GetTable():GetToolObject().Name == "Duplicator") and !advdupeonly)) then
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: dupeshare.PrepareTableToSave( table )
|
||||
Desc: Converts a table in to a lot tables to protect
|
||||
vectors, angles, bools, numbers, and indexes
|
||||
from being horribly raped by TableToKeyValues
|
||||
---------------------------------------------------------*/
|
||||
function dupeshare.PrepareTableToSave( t, done)
|
||||
|
||||
local done = done or {}
|
||||
local tbl = {}
|
||||
|
||||
for k, v in pairs ( t ) do
|
||||
if ( type( v ) == "table" and !done[ v ] ) then
|
||||
done[ v ] = true
|
||||
tbl[ k ] = dupeshare.PrepareTableToSave ( v, done )
|
||||
tbl[k].__name = k
|
||||
else
|
||||
if ( type(v) == "Vector" ) then
|
||||
local x, y, z = v.x, v.y, v.z
|
||||
if y == 0 then y = nil end
|
||||
if z == 0 then z = nil end
|
||||
tbl[k] = { __type = "Vector", x = x, y = y, z = z, __name = k }
|
||||
elseif ( type(v) == "Angle" ) then
|
||||
local p,y,r = v.pitch, v.yaw, v.roll
|
||||
if p == 0 then p = nil end
|
||||
if y == 0 then y = nil end
|
||||
if r == 0 then r = nil end
|
||||
tbl[k] = { __type = "Angle", p = p, y = y, r = r, __name = k }
|
||||
elseif ( type(v) == "boolean" ) then
|
||||
tbl[k] = { __type = "Bool", v = tostring( v ), __name = k }
|
||||
elseif ( type(v) == "number" ) then
|
||||
tbl[k] = { __type = "Number", v = tostring( v ), __name = k }
|
||||
else
|
||||
tbl[k] = { __type = "String", v = tostring( v ), __name = k }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return tbl
|
||||
end
|
||||
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: dupeshare.RebuildTableFromLoad( table )
|
||||
Desc: Removes the protection added by PrepareTableToSave
|
||||
after table is loaded with KeyValuesToTable
|
||||
---------------------------------------------------------*/
|
||||
function dupeshare.RebuildTableFromLoad( t, done )
|
||||
|
||||
local done = done or {}
|
||||
local tbl = {}
|
||||
|
||||
for k, v in pairs ( t ) do
|
||||
if ( type( v ) == "table" and !done[ v ] ) then
|
||||
done[ v ] = true
|
||||
if ( v.__type ) then
|
||||
if ( v.__type == "Vector" ) then
|
||||
tbl[ v.__name ] = Vector( v.x, v.y, v.z )
|
||||
elseif ( v.__type == "Angle" ) then
|
||||
tbl[ v.__name ] = Angle( v.p, v.y, v.r )
|
||||
elseif ( v.__type == "Bool" ) then
|
||||
tbl[ v.__name ] = util.tobool( v.v )
|
||||
elseif ( v.__type == "Number" ) then
|
||||
tbl[ v.__name ] = tonumber( v.v )
|
||||
elseif ( v.__type == "String" ) then
|
||||
tbl[ v.__name ] = tostring( v.v )
|
||||
end
|
||||
else
|
||||
tbl[ v.__name ] = dupeshare.RebuildTableFromLoad ( v, done )
|
||||
end
|
||||
else
|
||||
if k != "__name" then //don't add the table names to output
|
||||
tbl[ k ] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return tbl
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
function dupeshare.ProtectCase(str)
|
||||
str2=""
|
||||
for i = 1, string.len(str) do
|
||||
local chr = string.sub(str, i, i)
|
||||
if (chr != string.lower(chr)) then chr = "^"..chr end
|
||||
str2 = str2..chr
|
||||
end
|
||||
return str2
|
||||
end
|
||||
|
||||
function dupeshare.UnprotectCase(str)
|
||||
str2=""
|
||||
for i = 1, string.len(str) do
|
||||
local chr = string.sub(str, i, i)
|
||||
if (string.sub(str, i+1, i+1) == "^") then chr = string.upper(chr) end
|
||||
if char != "^" then str2 = str2..chr end
|
||||
end
|
||||
return str2
|
||||
end
|
||||
|
||||
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: dupeshare.FileNoOverWriteCheck( dir, filename )
|
||||
Desc: Check if dir and filename exist and if so renames
|
||||
returns filepath (dir.."/"..filename..".txt")
|
||||
---------------------------------------------------------*/
|
||||
function dupeshare.FileNoOverWriteCheck( dir, filename )
|
||||
|
||||
if !file.Exists(dir) then
|
||||
file.CreateDir(dir)
|
||||
elseif !file.IsDir(dir) then
|
||||
local x = 0
|
||||
while x ~= nil do
|
||||
x = x + 1
|
||||
if not file.Exists(dir.."_"..tostring(x)) then
|
||||
dir = dir.."_"..tostring(x)
|
||||
file.CreateDir(dir)
|
||||
x = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if file.Exists(dir .. "/" .. filename .. ".txt") then
|
||||
local x = 0
|
||||
while x ~= nil do
|
||||
x = x + 1
|
||||
if not file.Exists(dir.."/"..filename.."_"..tostring(x)..".txt") then
|
||||
filename = filename.."_"..tostring(x)
|
||||
x = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local filepath = dir .. "/" .. filename .. ".txt"
|
||||
|
||||
return filepath, filename, dir
|
||||
end
|
||||
|
||||
|
||||
/*---------------------------------------------------------
|
||||
cause garry's crashes the server
|
||||
and this one returns the filename without extention
|
||||
---------------------------------------------------------*/
|
||||
function dupeshare.GetFileFromFilename(path)
|
||||
|
||||
for i = string.len(path), 1, -1 do
|
||||
local str = string.sub(path, i, i)
|
||||
if str == "/" or str == "\\" then path = string.sub(path, (i + 1)) end
|
||||
end
|
||||
|
||||
//removed .txt from the end if its there.
|
||||
if (string.sub(path, -4) == ".txt") then
|
||||
path = string.sub(path, 1, -5)
|
||||
end
|
||||
|
||||
return path
|
||||
end
|
||||
|
||||
Msg("--- Wire duplicator shared module installed! ---\n")
|
||||
|
||||
|
||||
|
||||
//this file left blank on purpose to overwrite existing file on upgrade
|
||||
@@ -77,7 +77,7 @@ function ENT:BuildDupeInfo()
|
||||
return info
|
||||
end
|
||||
|
||||
function ENT:ApplyDupeInfo(ply, ent, info, GetEntByID, GetConstByID)
|
||||
function ENT:ApplyDupeInfo(ply, ent, info, GetEntByID)
|
||||
if (info.Wires) then
|
||||
for k,input in pairs(info.Wires) do
|
||||
Wire_Link_Start(ply:UniqueID(), ent, input.StartPos, k, input.Material, input.Color, input.Width)
|
||||
@@ -90,3 +90,21 @@ function ENT:ApplyDupeInfo(ply, ent, info, GetEntByID, GetConstByID)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
//new duplicator stuff
|
||||
//
|
||||
function ENT:PreEntityCopy()
|
||||
//build the DupeInfo table and save it as an entity mod
|
||||
local DupeInfo = self:BuildDupeInfo()
|
||||
if DupeInfo then
|
||||
duplicator.StoreEntityModifier( self.Entity, "WireDupeInfo", DupeInfo )
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:PostEntityPaste( Player, Ent, CreatedEntities )
|
||||
//apply the DupeInfo
|
||||
if (Ent.EntityMods) and (Ent.EntityMods.WireDupeInfo) then
|
||||
Ent:ApplyDupeInfo(Player, Ent, Ent.EntityMods.WireDupeInfo, function(id) return CreatedEntities[id] end)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -82,7 +82,7 @@ end*/
|
||||
|
||||
function ENT:Paste()
|
||||
if (self.stage != 0) then return end
|
||||
Msg("====start====\n")
|
||||
--Msg("====start====\n")
|
||||
|
||||
self:HideGhost(true)
|
||||
|
||||
@@ -106,7 +106,7 @@ function ENT:Paste()
|
||||
self.offset = self.Entity:GetPos() + self.Entity:GetUp() * self.Entity:OBBMaxs().z
|
||||
end
|
||||
|
||||
Msg("going to stage 1\n")
|
||||
--Msg("going to stage 1\n")
|
||||
self.stage = 1
|
||||
end
|
||||
|
||||
@@ -243,7 +243,7 @@ function ENT:Think()
|
||||
end
|
||||
end
|
||||
|
||||
Msg("going to stage 2\n")
|
||||
--Msg("going to stage 2\n")
|
||||
self.stage = 2
|
||||
self.Entity:NextThink(CurTime() + self.thinkdelay)
|
||||
return true
|
||||
@@ -277,7 +277,7 @@ function ENT:Think()
|
||||
return true
|
||||
end
|
||||
else
|
||||
Msg("going to stage 3\n")
|
||||
--Msg("going to stage 3\n")
|
||||
self.stage = 4
|
||||
self.Entity:NextThink(CurTime() + self.thinkdelay)
|
||||
return true
|
||||
@@ -286,7 +286,7 @@ function ENT:Think()
|
||||
|
||||
elseif (self.stage == 3) then
|
||||
|
||||
for id, infoTable in pairs(self.DupeInfo) do
|
||||
/*for id, infoTable in pairs(self.DupeInfo) do
|
||||
local ent = self.entIDtable[id]
|
||||
local isdupeinfo = false
|
||||
if (ent) and (ent:IsValid()) and (infoTable) and (ent.ApplyDupeInfo) then
|
||||
@@ -305,21 +305,32 @@ function ENT:Think()
|
||||
return true
|
||||
end
|
||||
end
|
||||
end*/
|
||||
|
||||
for id, infoTable in pairs(self.DupeInfo) do
|
||||
local ent = self.entIDtable[id]
|
||||
if (ent) and (ent:IsValid()) and (infoTable) and (ent.ApplyDupeInfo) then
|
||||
ent:ApplyDupeInfo(
|
||||
self:GetPlayer(), ent, infoTable,
|
||||
function(id) return self.entIDtable[id] end,
|
||||
function(id) return self.constIDtable[id] end
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
Msg("going to stage 4\n")
|
||||
--Msg("going to stage 4\n")
|
||||
self.stage = 4
|
||||
self.Entity:NextThink(CurTime() + self.thinkdelay)
|
||||
return true
|
||||
|
||||
elseif (self.stage == 4) then
|
||||
//this just looks wrong, so no
|
||||
/*Msg("starting rotate\n")
|
||||
duplicator.PasteRotate( self:GetPlayer(), self.HeadEntity, self.CreatedEnts )*/
|
||||
--Msg("starting rotate\n")
|
||||
duplicator.PasteRotate( self:GetPlayer(), self.HeadEntity, self.CreatedEnts )
|
||||
|
||||
duplicator.PasteApplyDORInfo( self.DORInfo, function(id) return self.entIDtable[id] end )
|
||||
|
||||
Msg("going to stage 5\n")
|
||||
--Msg("going to stage 5\n")
|
||||
self.stage = 5
|
||||
self.Entity:NextThink(CurTime() + self.thinkdelay)
|
||||
return true
|
||||
@@ -368,7 +379,7 @@ function ENT:Think()
|
||||
|
||||
|
||||
|
||||
Msg("====done====\n")
|
||||
--Msg("====done====\n")
|
||||
|
||||
self:HideGhost(false)
|
||||
|
||||
|
||||
@@ -91,6 +91,19 @@ function ENT:OnTakeDamage( dmginfo )
|
||||
//self.Entity:TakePhysicsDamage( dmginfo )
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: Think
|
||||
---------------------------------------------------------*/
|
||||
function ENT:Think()
|
||||
|
||||
self.Entity:NextThink( CurTime() + 0.25 )
|
||||
|
||||
self.Entity:SetNetworkedInt( "TargetZ", self:GetTargetZ() )
|
||||
|
||||
return true
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: Simulate
|
||||
---------------------------------------------------------*/
|
||||
@@ -110,10 +123,11 @@ function ENT:PhysicsSimulate( phys, deltatime )
|
||||
txt = txt.." (on)"
|
||||
self:SetOverlayText( txt )
|
||||
|
||||
|
||||
if ( self.ZVelocity != 0 ) then
|
||||
|
||||
self:SetTargetZ( self:GetTargetZ() + (self.ZVelocity * deltatime * self:GetSpeed()) )
|
||||
self.Entity:GetPhysicsObject():Wake()
|
||||
|
||||
end
|
||||
|
||||
phys:Wake()
|
||||
|
||||
@@ -23,3 +23,13 @@ function ENT:TriggerInput(iname, value)
|
||||
self:SetDisplayB( string.format("%.2f", value) )
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Setup(SingleValue, SingleBigFont, TextA, TextB)
|
||||
// Extra stuff for Wire Screen (TheApathetic)
|
||||
self:SetTextA(TextA)
|
||||
self:SetTextB(TextB)
|
||||
self:SetSingleBigFont(SingleBigFont)
|
||||
|
||||
// Put it here to update inputs if necessary (TheApathetic)
|
||||
self:SetSingleValue(SingleValue)
|
||||
end
|
||||
|
||||
@@ -175,7 +175,7 @@ function ENT:ApplyDupeInfo(ply, ent, info, GetEntByID)
|
||||
if (info.to_sense) then
|
||||
self:SetBeacon(GetEntByID(info.to_sense))
|
||||
if (!self.ToSense) then
|
||||
self:SetBeacon(ents.GetByIndexs(info.to_sense))
|
||||
self:SetBeacon(ents.GetByIndex(info.to_sense))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -48,9 +48,9 @@ end
|
||||
---------------------------------------------------------*/
|
||||
function ENT:SetAxis( vec )
|
||||
|
||||
self.Axis = self.Entity:GetPos() + (vec * 512)
|
||||
self.Axis = self.Entity:NearestPoint( self.Axis ) + vec
|
||||
self.Axis = self.Entity:WorldToLocal( self.Axis )
|
||||
self.Axis = self.Entity:GetPos() + vec * 512
|
||||
self.Axis = self.Entity:NearestPoint( self.Axis )
|
||||
self.Axis = self.Entity:WorldToLocal( self.Axis )
|
||||
|
||||
end
|
||||
|
||||
@@ -96,12 +96,18 @@ function ENT:SetMotor( Motor )
|
||||
end
|
||||
|
||||
function ENT:GetMotor()
|
||||
return self.Motor or NULL
|
||||
|
||||
if (!self.Motor) then
|
||||
self.Motor = constraint.FindConstraintEntity( self.Entity, "Motor" )
|
||||
end
|
||||
|
||||
return self.Motor
|
||||
end
|
||||
|
||||
|
||||
function ENT:SetDirection( dir )
|
||||
self.Entity:SetNetworkedInt( 1, dir )
|
||||
self.Direction = dir
|
||||
end
|
||||
|
||||
function ENT:SetToggle( bool )
|
||||
@@ -136,7 +142,8 @@ function ENT:Forward( mul )
|
||||
local Motor = self:GetMotor()
|
||||
if ( !Motor:IsValid() ) then
|
||||
Msg("Wheel doesn't have a motor!\n");
|
||||
return false end
|
||||
return false
|
||||
end
|
||||
|
||||
mul = mul or 1
|
||||
local mdir = Motor:GetTable().direction
|
||||
@@ -228,10 +235,9 @@ function ENT:DoDirectionEffect()
|
||||
if (!Motor || !Motor:IsValid()) then return end
|
||||
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin( self.Entity:LocalToWorld( self.Axis ) )
|
||||
effectdata:SetStart( self.Axis )
|
||||
effectdata:SetOrigin( self.Axis )
|
||||
effectdata:SetEntity( self.Entity )
|
||||
effectdata:SetScale( Motor:GetTable().direction )
|
||||
effectdata:SetScale( Motor.direction )
|
||||
util.Effect( "wheel_indicator", effectdata, true, true )
|
||||
|
||||
end
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -85,8 +85,7 @@ function TOOL:LeftClick( trace )
|
||||
// Don't weld to world, unless we wanted too
|
||||
if ( trace.Entity:IsValid() || worldweld ) then
|
||||
for x=1, 7 do
|
||||
const[x] = constraint.Weld( wire_indicators[x], trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_indicators[x] )
|
||||
const[x] = constraint.Weld( wire_indicators[x], trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
|
||||
// Don't disable collision if it's not attached to anything
|
||||
if ( collision == 0 ) then
|
||||
@@ -175,7 +174,7 @@ if (SERVER) then
|
||||
|
||||
//weld this segment to eveyone before it
|
||||
for y=1,x do
|
||||
const = constraint.Weld( wire_indicators[x], wire_indicators[y], 0, 0, 0, true )
|
||||
const = constraint.Weld( wire_indicators[x], wire_indicators[y], 0, 0, 0, true, true )
|
||||
end
|
||||
wire_indicators[x-1]:DeleteOnRemove( wire_indicators[x] ) //when one is removed, all are. a linked chain
|
||||
end
|
||||
|
||||
@@ -67,9 +67,19 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
local min = wire_adv_input:OBBMins()
|
||||
wire_adv_input:SetPos( trace.HitPos - trace.HitNormal * min.z )
|
||||
|
||||
|
||||
// Don't weld to world
|
||||
local const, nocollide
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_adv_input, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_adv_input:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_adv_input.nocollide = true
|
||||
end
|
||||
|
||||
undo.Create("WireInput")
|
||||
undo.AddEntity( wire_adv_input )
|
||||
undo.AddEntity( const )
|
||||
undo.SetPlayer( ply )
|
||||
undo.Finish()
|
||||
|
||||
|
||||
@@ -69,8 +69,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_button, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_button )
|
||||
const = constraint.Weld( wire_button, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_button:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_button.nocollide = true
|
||||
|
||||
@@ -78,10 +78,20 @@ function TOOL:LeftClick( trace )
|
||||
wire_cpu = MakeWireCpu( ply, Ang, trace.HitPos, Smodel )
|
||||
local min = wire_cpu:OBBMins()
|
||||
wire_cpu:SetPos( trace.HitPos - trace.HitNormal * min.z )
|
||||
|
||||
|
||||
local const, nocollide
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_cpu, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_cpu:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_cpu.nocollide = true
|
||||
end
|
||||
|
||||
undo.Create("WireCpu")
|
||||
undo.AddEntity( wire_cpu )
|
||||
undo.SetPlayer( ply )
|
||||
undo.AddEntity( const )
|
||||
undo.Finish()
|
||||
|
||||
ply:AddCleanup( "wire_cpus", wire_cpu )
|
||||
|
||||
@@ -61,8 +61,7 @@ function TOOL:LeftClick( trace )
|
||||
local min = wire_detonator:OBBMins()
|
||||
wire_detonator:SetPos( trace.HitPos - trace.HitNormal * min.z )
|
||||
|
||||
const = constraint.Weld( wire_detonator, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_detonator )
|
||||
const = constraint.Weld( wire_detonator, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
|
||||
// Don't disable collision if it's not attached to anything
|
||||
if ( collision == 0 ) then
|
||||
|
||||
@@ -69,8 +69,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_dual_input, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_dual_input )
|
||||
const = constraint.Weld( wire_dual_input, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_dual_input:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_dual_input.nocollide = true
|
||||
|
||||
@@ -128,8 +128,11 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() && _weld ) then
|
||||
const, nocollide = constraint.Weld( explosive, trace.Entity, 0, trace.PhysicsBone, 0, collision == 0 )
|
||||
if (!_noparentremove) then trace.Entity:DeleteOnRemove( explosive ) end
|
||||
if (_noparentremove) then
|
||||
const, nocollide = constraint.Weld( explosive, trace.Entity, 0, trace.PhysicsBone, 0, collision == 0 )
|
||||
else
|
||||
const, nocollide = constraint.Weld( explosive, trace.Entity, 0, trace.PhysicsBone, 0, collision == 0, true )
|
||||
end
|
||||
end
|
||||
|
||||
if (_weight <= 0) then _weight = 1 end
|
||||
|
||||
@@ -52,8 +52,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_forcer, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_forcer )
|
||||
const = constraint.Weld( wire_forcer, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_forcer:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_forcer:GetTable().nocollide = true
|
||||
|
||||
@@ -62,8 +62,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_gate_arithmetic, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_gate_arithmetic )
|
||||
const = constraint.Weld( wire_gate_arithmetic, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_gate_arithmetic:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_gate_arithmetic.nocollide = true
|
||||
|
||||
@@ -60,8 +60,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_gate_comparison, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_gate_comparison )
|
||||
const = constraint.Weld( wire_gate_comparison, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_gate_comparison:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_gate_comparison.nocollide = true
|
||||
|
||||
@@ -60,8 +60,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_gate_logic, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_gate_logic )
|
||||
const = constraint.Weld( wire_gate_logic, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_gate_logic:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_gate_logic.nocollide = true
|
||||
|
||||
@@ -59,8 +59,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_gate_memory, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_gate_memory )
|
||||
const = constraint.Weld( wire_gate_memory, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_gate_memory:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_gate_memory.nocollide = true
|
||||
|
||||
@@ -60,8 +60,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_gate_selection, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_gate_selection )
|
||||
const = constraint.Weld( wire_gate_selection, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_gate_selection:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_gate_selection.nocollide = true
|
||||
|
||||
@@ -60,8 +60,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_gate_time, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_gate_time )
|
||||
const = constraint.Weld( wire_gate_time, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_gate_time:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_gate_time.nocollide = true
|
||||
|
||||
@@ -60,8 +60,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_gate_trig, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_gate_trig )
|
||||
const = constraint.Weld( wire_gate_trig, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_gate_trig:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_gate_trig.nocollide = true
|
||||
|
||||
@@ -53,8 +53,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_gps, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_gps )
|
||||
const = constraint.Weld( wire_gps, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_gps:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_gps.nocollide = true
|
||||
|
||||
@@ -58,8 +58,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_gyroscope, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_gyroscope )
|
||||
const = constraint.Weld( wire_gyroscope, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_gyroscope:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_gyroscope.nocollide = true
|
||||
|
||||
@@ -78,9 +78,8 @@ function TOOL:LeftClick( trace )
|
||||
// Don't weld to world
|
||||
if ( trace.Entity != NULL && !trace.Entity:IsWorld() ) then
|
||||
|
||||
const = constraint.Weld( trace.Entity, wire_ball, trace.PhysicsBone, 0, 0, true )
|
||||
const = constraint.Weld( trace.Entity, wire_ball, trace.PhysicsBone, 0, 0, true, true )
|
||||
nocollide = constraint.NoCollide( trace.Entity, wire_ball, 0, trace.PhysicsBone )
|
||||
trace.Entity:DeleteOnRemove( wire_ball )
|
||||
|
||||
wire_ball:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_ball:GetTable().nocollide = true
|
||||
|
||||
@@ -61,8 +61,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
local const2 = constraint.Weld( controller, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( controller )
|
||||
local const2 = constraint.Weld( controller, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
controller:GetPhysicsObject():EnableCollisions( false )
|
||||
controller.nocollide = true
|
||||
|
||||
@@ -101,8 +101,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_indicator, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_indicator )
|
||||
const = constraint.Weld( wire_indicator, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
|
||||
// Don't disable collision if it's not attached to anything
|
||||
if ( collision == 0 ) then
|
||||
|
||||
@@ -63,8 +63,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_input, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_input )
|
||||
const = constraint.Weld( wire_input, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_input:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_input.nocollide = true
|
||||
|
||||
@@ -70,8 +70,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_light, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_light )
|
||||
const = constraint.Weld( wire_light, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
|
||||
// Don't disable collision if it's not attached to anything
|
||||
if ( collision == 0 ) then
|
||||
|
||||
@@ -48,8 +48,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_nailer, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_nailer )
|
||||
const = constraint.Weld( wire_nailer, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_nailer:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_nailer:GetTable().nocollide = true
|
||||
|
||||
@@ -57,8 +57,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
local const, nocollide
|
||||
|
||||
const = constraint.Weld( wire_output, trace.Entity, 0, trace.PhysicsBone, 0, collision == 0 )
|
||||
trace.Entity:DeleteOnRemove( wire_output )
|
||||
const = constraint.Weld( wire_output, trace.Entity, 0, trace.PhysicsBone, 0, collision == 0, true )
|
||||
wire_output:GetPhysicsObject():EnableCollisions( false )
|
||||
|
||||
undo.Create("WireOutput")
|
||||
|
||||
@@ -53,8 +53,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_pixel, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_pixel )
|
||||
const = constraint.Weld( wire_pixel, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
|
||||
// Don't disable collision if it's not attached to anything
|
||||
if ( collision == 0 ) then
|
||||
|
||||
@@ -46,8 +46,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_pod, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_pod )
|
||||
const = constraint.Weld( wire_pod, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_pod:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_pod:GetTable().nocollide = true
|
||||
|
||||
@@ -54,10 +54,23 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
local min = wire_radio:OBBMins()
|
||||
wire_radio:SetPos( trace.HitPos - trace.HitNormal * (min.z-5) )
|
||||
|
||||
|
||||
// Don't weld to world
|
||||
local const
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
local const = constraint.Weld( wire_radio, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
|
||||
// Don't disable collision if it's not attached to anything
|
||||
if ( collision == 0 ) then
|
||||
wire_radio:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_radio:GetTable().nocollide = true
|
||||
end
|
||||
end
|
||||
|
||||
undo.Create("WireRadio")
|
||||
undo.AddEntity( wire_radio )
|
||||
undo.SetPlayer( ply )
|
||||
undo.AddEntity(const)
|
||||
undo.Finish()
|
||||
|
||||
|
||||
|
||||
@@ -96,8 +96,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_ranger, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_ranger )
|
||||
const = constraint.Weld( wire_ranger, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_ranger:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_ranger.nocollide = true
|
||||
|
||||
@@ -87,8 +87,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_relay, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_relay )
|
||||
const = constraint.Weld( wire_relay, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_relay:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_relay.nocollide = true
|
||||
|
||||
@@ -43,24 +43,22 @@ function TOOL:LeftClick( trace )
|
||||
if (not util.IsValidModel(self:GetClientInfo( "model" ))) then return false end
|
||||
if (not util.IsValidProp(self:GetClientInfo( "model" ))) then return false end
|
||||
|
||||
local ply = self:GetOwner()
|
||||
local Ang = trace.HitNormal:Angle()
|
||||
local Smodel = self:GetClientInfo( "model" )
|
||||
local ply = self:GetOwner()
|
||||
local Ang = trace.HitNormal:Angle()
|
||||
local Smodel = self:GetClientInfo( "model" )
|
||||
|
||||
// Extra stuff for Wire Screen (TheApathetic)
|
||||
local SingleValue = self:GetClientNumber("singlevalue") == 1
|
||||
local SingleBigFont = self:GetClientNumber("singlebigfont") == 1
|
||||
local TextA = self:GetClientInfo("texta")
|
||||
local TextB = self:GetClientInfo("textb")
|
||||
local SingleValue = self:GetClientNumber("singlevalue") == 1
|
||||
local SingleBigFont = self:GetClientNumber("singlebigfont") == 1
|
||||
local TextA = self:GetClientInfo("texta")
|
||||
local TextB = self:GetClientInfo("textb")
|
||||
|
||||
// Check to update screen if necessary (TheApathetic)
|
||||
if (trace.Entity:IsValid() && trace.Entity:GetClass() == "gmod_wire_screen" && trace.Entity.pl == ply) then
|
||||
trace.Entity:SetSingleValue(SingleValue)
|
||||
trace.Entity:SetSingleBigFont(SingleBigFont)
|
||||
trace.Entity:SetTextA(TextA)
|
||||
trace.Entity:SetTextB(TextB)
|
||||
trace.Entity.SingleValue = SingleValue
|
||||
trace.Entity.SingleBigFont = SingleBigFont
|
||||
trace.Entity:Setup(SingleValue, SingleBigFont, TextA, TextB)
|
||||
|
||||
trace.Entity.SingleValue = SingleValue
|
||||
trace.Entity.SingleBigFont = SingleBigFont
|
||||
trace.Entity.TextA = TextA
|
||||
trace.Entity.TextB = TextB
|
||||
return true
|
||||
@@ -91,28 +89,21 @@ if (SERVER) then
|
||||
local wire_screen = ents.Create( "gmod_wire_screen" )
|
||||
if (!wire_screen:IsValid()) then return false end
|
||||
wire_screen:SetModel(Smodel)
|
||||
|
||||
// Extra stuff for Wire Screen (TheApathetic)
|
||||
wire_screen:GetTable():SetTextA(TextA)
|
||||
wire_screen:GetTable():SetTextB(TextB)
|
||||
wire_screen:GetTable():SetSingleBigFont(SingleBigFont)
|
||||
|
||||
wire_screen:SetAngles( Ang )
|
||||
wire_screen:SetPos( Pos )
|
||||
wire_screen:Spawn()
|
||||
|
||||
// Put it here to update inputs if necessary (TheApathetic)
|
||||
wire_screen:GetTable():SetSingleValue(SingleValue)
|
||||
|
||||
wire_screen:Setup(SingleValue, SingleBigFont, TextA, TextB)
|
||||
|
||||
wire_screen:SetPlayer(pl)
|
||||
|
||||
local ttable = {
|
||||
pl = pl,
|
||||
Smodel = Smodel,
|
||||
SingleValue = SingleValue,
|
||||
SingleBigFont = SingleBigFont,
|
||||
TextA = TextA,
|
||||
TextB = TextB
|
||||
pl = pl,
|
||||
Smodel = Smodel,
|
||||
SingleValue = SingleValue,
|
||||
SingleBigFont = SingleBigFont,
|
||||
TextA = TextA,
|
||||
TextB = TextB
|
||||
}
|
||||
|
||||
table.Merge(wire_screen:GetTable(), ttable )
|
||||
|
||||
@@ -69,8 +69,7 @@ function TOOL:LeftClick(trace)
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const, nocollide = constraint.Weld( wire_sensor, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_sensor )
|
||||
const, nocollide = constraint.Weld( wire_sensor, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_sensor:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_sensor.nocollide = true
|
||||
|
||||
@@ -121,7 +121,13 @@ function TOOL:LeftClick( trace )
|
||||
if ( trace.Entity:IsValid() && _weld ) then
|
||||
local const, nocollide = constraint.Weld( explosive, trace.Entity, 0, trace.PhysicsBone, 0, collision == 0 )
|
||||
undo.AddEntity( const )
|
||||
if (!_noparentremove) then trace.Entity:DeleteOnRemove( explosive ) end
|
||||
if (_noparentremove) then
|
||||
local const, nocollide = constraint.Weld( explosive, trace.Entity, 0, trace.PhysicsBone, 0, collision == 0, false )
|
||||
undo.AddEntity( const )
|
||||
else
|
||||
local const, nocollide = constraint.Weld( explosive, trace.Entity, 0, trace.PhysicsBone, 0, collision == 0, true )
|
||||
undo.AddEntity( const )
|
||||
end
|
||||
end
|
||||
|
||||
undo.SetPlayer( ply )
|
||||
|
||||
@@ -68,8 +68,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_emitter, trace.Entity, 0, trace.PhysicsBone, 0, (collision == 0) )
|
||||
trace.Entity:DeleteOnRemove( wire_emitter )
|
||||
const = constraint.Weld( wire_emitter, trace.Entity, 0, trace.PhysicsBone, 0, (collision == 0), true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_emitter:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_emitter.nocollide = true
|
||||
|
||||
@@ -61,8 +61,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_speedometer, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_speedometer )
|
||||
const = constraint.Weld( wire_speedometer, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_speedometer:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_speedometer.nocollide = true
|
||||
|
||||
@@ -113,8 +113,7 @@ function TOOL:LeftClick(trace)
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const, nocollide = constraint.Weld( wire_target_finder, trace.Entity, 0, trace.PhysicsBone, 0, collision == 0 )
|
||||
trace.Entity:DeleteOnRemove( wire_target_finder )
|
||||
const, nocollide = constraint.Weld( wire_target_finder, trace.Entity, 0, trace.PhysicsBone, 0, collision == 0, true )
|
||||
end
|
||||
|
||||
undo.Create("WireTargetFinder")
|
||||
|
||||
@@ -103,8 +103,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const, nocollide = constraint.Weld( wire_thruster, trace.Entity, 0, trace.PhysicsBone, 0, collision )
|
||||
trace.Entity:DeleteOnRemove( wire_thruster )
|
||||
const, nocollide = constraint.Weld( wire_thruster, trace.Entity, 0, trace.PhysicsBone, 0, collision, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
if ( collision ) then
|
||||
wire_thruster:GetPhysicsObject():EnableCollisions( false )
|
||||
|
||||
@@ -123,9 +123,8 @@ function TOOL:LeftClick( trace, worldweld )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity != NULL && (!trace.Entity:IsWorld() || worldweld) ) then
|
||||
|
||||
weld = constraint.Weld( trace.Entity, turret, trace.PhysicsBone, 0, 0 )
|
||||
trace.Entity:DeleteOnRemove( turret )
|
||||
Weld( Ent1, Ent2, Bone1, Bone2, forcelimit, nocollide, deleteonbreak )
|
||||
weld = constraint.Weld( trace.Entity, turret, trace.PhysicsBone, 0, 0, true, true )
|
||||
|
||||
// Don't hit your parents or you will go to jail.
|
||||
|
||||
|
||||
@@ -71,10 +71,23 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
local min = wire_twoway_radio:OBBMins()
|
||||
wire_twoway_radio:SetPos( trace.HitPos - trace.HitNormal * (min.z-5) )
|
||||
|
||||
|
||||
// Don't weld to world
|
||||
local const
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
local const = constraint.Weld( wire_twoway_radio, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
|
||||
// Don't disable collision if it's not attached to anything
|
||||
if ( collision == 0 ) then
|
||||
wire_twoway_radio:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_twoway_radio:GetTable().nocollide = true
|
||||
end
|
||||
end
|
||||
|
||||
undo.Create("WireTwoWay_Radio")
|
||||
undo.AddEntity( wire_twoway_radio )
|
||||
undo.SetPlayer( ply )
|
||||
undo.AddEntity( const )
|
||||
undo.Finish()
|
||||
|
||||
ply:AddCleanup( "wire_twoway_radioes", wire_twoway_radio )
|
||||
|
||||
@@ -59,8 +59,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
const = constraint.Weld( wire_value, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( wire_value )
|
||||
const = constraint.Weld( wire_value, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
wire_value:GetPhysicsObject():EnableCollisions( false )
|
||||
wire_value.nocollide = true
|
||||
|
||||
@@ -77,7 +77,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
|
||||
// Create the wheel
|
||||
local wheelEnt = MakeWireWheel( ply, trace.HitPos, Angle(0,0,0), model, nil, nil, nil, fwd, bck, stop )
|
||||
local wheelEnt = MakeWireWheel( ply, trace.HitPos, Angle(0,0,0), model, nil, nil, nil, fwd, bck, stop, toggle )
|
||||
|
||||
|
||||
// Make sure we have our wheel angle
|
||||
@@ -109,18 +109,17 @@ function TOOL:LeftClick( trace )
|
||||
undo.AddEntity( wheelEnt )
|
||||
undo.SetPlayer( ply )
|
||||
undo.Finish()
|
||||
|
||||
|
||||
ply:AddCleanup( "wire_wheels", axis )
|
||||
ply:AddCleanup( "wire_wheels", constraint )
|
||||
ply:AddCleanup( "wire_wheels", wheelEnt )
|
||||
|
||||
wheelEnt:GetTable():SetMotor( constraint )
|
||||
wheelEnt:GetTable():SetDirection( constraint:GetTable().direction )
|
||||
wheelEnt:GetTable():SetAxis( trace.HitNormal )
|
||||
wheelEnt:GetTable():SetToggle( toggle )
|
||||
wheelEnt:GetTable():DoDirectionEffect()
|
||||
wheelEnt:GetTable():SetBaseTorque( torque )
|
||||
wheelEnt:SetMotor( constraint )
|
||||
wheelEnt:SetDirection( constraint.direction )
|
||||
wheelEnt:SetAxis( trace.HitNormal )
|
||||
wheelEnt:SetToggle( toggle )
|
||||
wheelEnt:DoDirectionEffect()
|
||||
wheelEnt:SetBaseTorque( torque )
|
||||
|
||||
return true
|
||||
|
||||
@@ -166,10 +165,10 @@ if ( SERVER ) then
|
||||
/*---------------------------------------------------------
|
||||
For duplicator, creates the wheel.
|
||||
---------------------------------------------------------*/
|
||||
function MakeWireWheel( pl, Pos, Ang, Model, Vel, aVel, frozen, fwd, bck, stop )
|
||||
|
||||
function MakeWireWheel( pl, Pos, Ang, Model, Vel, aVel, frozen, fwd, bck, stop, toggle, direction, Axis, Data )
|
||||
|
||||
if ( !pl:CheckLimit( "wire_wheels" ) ) then return false end
|
||||
|
||||
|
||||
local wheel = ents.Create( "gmod_wire_wheel" )
|
||||
if ( !wheel:IsValid() ) then return end
|
||||
|
||||
@@ -178,39 +177,32 @@ if ( SERVER ) then
|
||||
wheel:SetAngles( Ang )
|
||||
wheel:Spawn()
|
||||
|
||||
wheel:GetTable():SetPlayer( pl )
|
||||
|
||||
if ( wheel:GetPhysicsObject():IsValid() ) then
|
||||
wheel:SetPlayer( pl )
|
||||
|
||||
duplicator.DoGenericPhysics( wheel, pl, Data )
|
||||
|
||||
Phys = wheel:GetPhysicsObject()
|
||||
if Vel then Phys:SetVelocity(Vel) end
|
||||
if aVel then Phys:AddAngleVelocity(aVel) end
|
||||
Phys:EnableMotion(frozen != true)
|
||||
|
||||
end
|
||||
|
||||
wheel:GetTable().model = model
|
||||
wheel:GetTable().fwd = fwd
|
||||
wheel:GetTable().bck = bck
|
||||
wheel:GetTable().stop = stop
|
||||
wheel.model = model
|
||||
wheel.fwd = fwd
|
||||
wheel.bck = bck
|
||||
wheel.stop = stop
|
||||
|
||||
wheel:GetTable():SetFwd( fwd )
|
||||
wheel:GetTable():SetBck( bck )
|
||||
wheel:GetTable():SetStop( stop )
|
||||
wheel:SetFwd( fwd )
|
||||
wheel:SetBck( bck )
|
||||
wheel:SetStop( stop )
|
||||
|
||||
if ( axis ) then
|
||||
wheel.Axis = axis
|
||||
end
|
||||
|
||||
/*local ttable = {
|
||||
pl = pl,
|
||||
nocollide = nocollide,
|
||||
description = description,
|
||||
Pos = Pos,
|
||||
Ang = Ang,
|
||||
Model = Model,
|
||||
fwd = fwd,
|
||||
bck = bck,
|
||||
stop = stop
|
||||
}
|
||||
if ( direction ) then
|
||||
wheel:SetDirection( direction )
|
||||
end
|
||||
|
||||
if ( toggle ) then
|
||||
wheel:SetToggle( toggle )
|
||||
end
|
||||
|
||||
table.Merge( wheel:GetTable(), ttable )*/
|
||||
|
||||
|
||||
pl:AddCount( "wire_wheels", wheel )
|
||||
@@ -219,9 +211,9 @@ if ( SERVER ) then
|
||||
|
||||
end
|
||||
|
||||
duplicator.RegisterEntityClass( "gmod_wire_wheel", MakeWireWheel, "Pos", "Ang", "model", "Vel", "aVel", "frozen", "fwd", "bck", "stop" )
|
||||
duplicator.RegisterEntityClass( "gmod_wire_wheel", MakeWireWheel, "Pos", "Ang", "model", "Vel", "aVel", "frozen", "fwd", "bck", "stop", "Axis", "Data" )
|
||||
|
||||
|
||||
|
||||
end
|
||||
|
||||
function TOOL:UpdateGhostWireWheel( ent, player )
|
||||
|
||||
@@ -65,8 +65,7 @@ function TOOL:LeftClick( trace )
|
||||
|
||||
// Don't weld to world
|
||||
if ( trace.Entity:IsValid() ) then
|
||||
local const2 = constraint.Weld( controller, trace.Entity, 0, trace.PhysicsBone, 0, true )
|
||||
trace.Entity:DeleteOnRemove( controller )
|
||||
local const2 = constraint.Weld( controller, trace.Entity, 0, trace.PhysicsBone, 0, true, true )
|
||||
// Don't disable collision if it's not attached to anything
|
||||
controller:GetPhysicsObject():EnableCollisions( false )
|
||||
controller.nocollide = true
|
||||
|
||||
Reference in New Issue
Block a user