buldthensnip/pkg/base/plug_pmfedit.lua

192 lines
5.7 KiB
Lua

--[[
This file is part of Ice Lua Components.
Ice Lua Components is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Ice Lua Components 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with Ice Lua Components. If not, see <http://www.gnu.org/licenses/>.
]]
print("pmfedit selected")
PMFEDIT_FNAME = "clsave/vol/editor.pmf"
BTSK_PMF_EDIT = SDLK_F2
BTSK_PMF_MOVEXN = SDLK_l
BTSK_PMF_MOVEXP = SDLK_j
BTSK_PMF_MOVEYN = SDLK_i
BTSK_PMF_MOVEYP = SDLK_k
BTSK_PMF_MOVEZN = SDLK_u
BTSK_PMF_MOVEZP = SDLK_o
BTSK_PMF_SIZEP = SDLK_EQUALS
BTSK_PMF_SIZEN = SDLK_MINUS
BTSK_PMF_ROTYN = SDLK_LEFTBRACKET
BTSK_PMF_ROTYP = SDLK_RIGHTBRACKET
BTSK_PMF_BLKSET = SDLK_g
BTSK_PMF_BLKCLEAR = SDLK_b
BTSK_PMF_QUICKLOAD = SDLK_F3
BTSK_PMF_QUICKSAVE = SDLK_F10
pmfedit_enabled = false
pmfedit_x = 0
pmfedit_y = 0
pmfedit_z = 0
pmfedit_size = 16
pmfedit_data = {}
pmfedit_model = common.model_new(1)
pmfedit_model, pmfedit_model_bone = common.model_bone_new(pmfedit_model)
pmfedit_data[#pmfedit_data+1] = {x=0,y=0,z=0,r=0,g=0,b=0,radius=1}
pmfedit_rx = 0
do
local old_tickhook = client.hook_tick
function pmfhook_tick(sec_current, sec_delta)
pmfedit_data[#pmfedit_data] = {
x=pmfedit_x,y=pmfedit_y,z=pmfedit_z-0.01,
r=math.sin(sec_current-2*math.pi/3)*127+128,
g=math.sin(sec_current)*127+128,
b=math.sin(sec_current+2*math.pi/3)*127+128,
radius=pmfedit_size}
common.model_bone_set(pmfedit_model, pmfedit_model_bone, "edit", pmfedit_data)
-- chain along
client.hook_tick = old_tickhook
local ret = old_tickhook(sec_current, sec_delta)
old_tickhook = client.hook_tick
client.hook_tick = pmfhook_tick
return ret
end
client.hook_tick = pmfhook_tick
local old_keyhook = client.hook_key
function client.hook_key(key, uni, state, modif)
if state then
if pmfedit_enabled then
if key == BTSK_PMF_MOVEXN then
pmfedit_x = pmfedit_x - pmfedit_size
elseif key == BTSK_PMF_MOVEXP then
pmfedit_x = pmfedit_x + pmfedit_size
elseif key == BTSK_PMF_MOVEYN then
pmfedit_y = pmfedit_y - pmfedit_size
elseif key == BTSK_PMF_MOVEYP then
pmfedit_y = pmfedit_y + pmfedit_size
elseif key == BTSK_PMF_MOVEZN then
pmfedit_z = pmfedit_z - pmfedit_size
elseif key == BTSK_PMF_MOVEZP then
pmfedit_z = pmfedit_z + pmfedit_size
elseif key == BTSK_PMF_SIZEN and pmfedit_size > 1 then
pmfedit_size = pmfedit_size - 1
elseif key == BTSK_PMF_SIZEP and pmfedit_size < 65535 then
pmfedit_size = pmfedit_size + 1
elseif key == SDLK_LEFTBRACKET then
pmfedit_rx = pmfedit_rx + math.pi/16
elseif key == SDLK_RIGHTBRACKET then
pmfedit_rx = pmfedit_rx - math.pi/16
elseif key == BTSK_PMF_BLKSET and #pmfedit_data < 4095 then
local plr = players[players.current]
pmfedit_data[#pmfedit_data].r = plr.blk_color[1]
pmfedit_data[#pmfedit_data].g = plr.blk_color[2]
pmfedit_data[#pmfedit_data].b = plr.blk_color[3]
pmfedit_data[#pmfedit_data+1] = pmfedit_data[#pmfedit_data]
elseif key == BTSK_PMF_BLKCLEAR then
if #pmfedit_data > 1 then
local i
local dx,dy,dz
local d
local mi,md
mi = 1
md = nil
-- find nearest piece
for i=1,#pmfedit_data-1 do
dx = pmfedit_data[i].x - pmfedit_x
dy = pmfedit_data[i].y - pmfedit_y
dz = pmfedit_data[i].z - pmfedit_z
d = dx*dx+dy*dy+dz*dz
if md == nil or d < md then
md = d
mi = i
end
end
-- delete it and move to it
pmfedit_x = pmfedit_data[mi].x
pmfedit_y = pmfedit_data[mi].y
pmfedit_z = pmfedit_data[mi].z
pmfedit_size = pmfedit_data[mi].radius
for i=mi,#pmfedit_data-1 do
pmfedit_data[i] = pmfedit_data[i+1]
end
pmfedit_data[#pmfedit_data] = nil
end
elseif key == BTSK_PMF_QUICKLOAD then
local xpmf = common.model_load_pmf(PMFEDIT_FNAME)
if xpmf then
common.model_free(pmfedit_model) -- YECCH! Forgot this line!
pmfedit_model = xpmf
pmfedit_model_bone = 0
local bname
bname, pmfedit_data = common.model_bone_get(pmfedit_model, pmfedit_model_bone)
pmfedit_data[#pmfedit_data+1] = {}
print("loaded!")
else
print("error during loading - NOT LOADED")
end
elseif key == BTSK_PMF_QUICKSAVE then
local xpt = pmfedit_data[#pmfedit_data]
pmfedit_data[#pmfedit_data] = nil
local bname, blah
bname, blah = common.model_bone_get(pmfedit_model, pmfedit_model_bone)
common.model_bone_set(pmfedit_model, pmfedit_model_bone, bname, pmfedit_data)
if common.model_save_pmf(pmfedit_model, PMFEDIT_FNAME) then
print("saved!")
else
print("error during saving - NOT SAVED")
end
pmfedit_data[#pmfedit_data+1] = xpt
end
end
if key == BTSK_PMF_EDIT then
pmfedit_enabled = not pmfedit_enabled
end
end
return old_keyhook(key, state, modif)
end
local old_renderhook = client.hook_render
-- I still believe the "Old Kenderhook" explanation for the meaning of O.K. is a load of crap. --GM
function client.hook_render()
if pmfedit_enabled then
font_mini.print(4,40,0x80FFFFFF,string.format(
"PMF - size: %-6i x: %-6i y: %6i z: %-6i - COUNT: %6i / rot: %3f"
,pmfedit_size
,pmfedit_x
,pmfedit_y
,pmfedit_z
,#pmfedit_data-1
,pmfedit_rx))
client.model_render_bone_local(pmfedit_model, pmfedit_model_bone,
0,0,1,
pmfedit_rx,0,0,
0.7)
end
return old_renderhook()
end
end
print("pmfedit loaded")