mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
140
lua/pac3/editor/client/undo.lua
Normal file
140
lua/pac3/editor/client/undo.lua
Normal file
@@ -0,0 +1,140 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
function pace.ClearUndo()
|
||||
pace.UndoPosition = 1
|
||||
pace.UndoHistory = {}
|
||||
end
|
||||
|
||||
local function get_current_outfit()
|
||||
local data = {}
|
||||
|
||||
for key, part in pairs(pac.GetLocalParts()) do
|
||||
if not part:HasParent() and part:GetShowInEditor() then
|
||||
table.insert(data, part:ToUndoTable())
|
||||
end
|
||||
end
|
||||
|
||||
return data
|
||||
end
|
||||
|
||||
local function find_uid_part(part, findpart)
|
||||
for _, child in ipairs(part.children) do
|
||||
if child.self.UniqueID == findpart.self.UniqueID then
|
||||
return child
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function diff_remove(a, b, aparent, bparent)
|
||||
|
||||
for _, apart in ipairs(a.children) do
|
||||
local bpart = find_uid_part(b, apart)
|
||||
|
||||
if not bpart then
|
||||
local part = pac.GetPartFromUniqueID(pac.Hash(pac.LocalPlayer), apart.self.UniqueID)
|
||||
local parent = pac.GetPartFromUniqueID(pac.Hash(pac.LocalPlayer), apart.self.ParentUID)
|
||||
|
||||
if part:IsValid() then
|
||||
if part:GetParent() == parent then
|
||||
do
|
||||
local parent = part:GetParent()
|
||||
if parent:IsValid() then pace.Call("PartSelected", parent) end
|
||||
end
|
||||
part:Remove()
|
||||
end
|
||||
end
|
||||
else
|
||||
diff_remove(apart, bpart, a, b)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local function diff_create(a, b, aparent, bparent)
|
||||
|
||||
for _, bpart in ipairs(b.children) do
|
||||
local apart = find_uid_part(a, bpart)
|
||||
|
||||
if apart then
|
||||
for key, aval in pairs(apart.self) do
|
||||
local bval = bpart.self[key]
|
||||
|
||||
if aval ~= bval then
|
||||
local part = pac.GetPartFromUniqueID(pac.Hash(pac.LocalPlayer), bpart.self.UniqueID)
|
||||
local parent = pac.GetPartFromUniqueID(pac.Hash(pac.LocalPlayer), apart.self.ParentUID)
|
||||
|
||||
if part:IsValid() and part:GetParent() == parent then
|
||||
if part["Set" .. key] then
|
||||
pace.Call("VariableChanged", part, key, bval, true)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
diff_create(apart, bpart, a, b)
|
||||
else
|
||||
local part = pac.CreatePart(bpart.self.ClassName)
|
||||
part:SetUndoTable(bpart)
|
||||
pace.Call("PartSelected", part)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function pace.ApplyDifference(data)
|
||||
local A = get_current_outfit()
|
||||
local B = data
|
||||
|
||||
diff_remove({children = A}, {children = B})
|
||||
diff_create({children = A}, {children = B})
|
||||
end
|
||||
|
||||
pace.ClearUndo()
|
||||
|
||||
local last_json
|
||||
|
||||
function pace.RecordUndoHistory()
|
||||
local data = get_current_outfit()
|
||||
|
||||
local json = util.TableToJSON(data)
|
||||
if json == last_json then return end
|
||||
last_json = json
|
||||
|
||||
for i = pace.UndoPosition + 1, #pace.UndoHistory do
|
||||
table.remove(pace.UndoHistory)
|
||||
end
|
||||
|
||||
table.insert(pace.UndoHistory, data)
|
||||
pace.UndoPosition = #pace.UndoHistory
|
||||
end
|
||||
|
||||
function pace.Undo()
|
||||
pace.UndoPosition = math.Clamp(pace.UndoPosition - 1, 0, #pace.UndoHistory)
|
||||
local data = pace.UndoHistory[pace.UndoPosition]
|
||||
|
||||
if data then
|
||||
pace.ApplyDifference(data)
|
||||
pace.FlashNotification("Undo position: " .. pace.UndoPosition .. "/" .. #pace.UndoHistory)
|
||||
else
|
||||
pace.FlashNotification('Nothing to undo')
|
||||
end
|
||||
end
|
||||
|
||||
function pace.Redo()
|
||||
pace.UndoPosition = math.Clamp(pace.UndoPosition + 1, 1, #pace.UndoHistory + 1)
|
||||
local data = pace.UndoHistory[pace.UndoPosition]
|
||||
|
||||
if data then
|
||||
pace.ApplyDifference(data)
|
||||
pace.FlashNotification("Undo position: " .. pace.UndoPosition .. "/" .. #pace.UndoHistory)
|
||||
else
|
||||
pace.FlashNotification('Nothing to redo')
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user