79 lines
3.3 KiB
Lua
79 lines
3.3 KiB
Lua
local Vec = vector
|
|
--[[offsets = {
|
|
head = vector.new(0,6.3,0),
|
|
arm_right = vector.new(-3.15, 5.5, 0),
|
|
arm_right_global = vector.new(-3.15, 11.55, 0), --can be low precision
|
|
arm_left = vector.new(3.15, 5.5, 0),
|
|
arm_left_global = vector.new(3.15, 11.55, 0),
|
|
}]]
|
|
Guns4d.player_model_handler = {
|
|
offsets = {
|
|
arm = {
|
|
right = Vec.new(-3.15, 11.55, 0),
|
|
rltv_right = Vec.new(-3.15, 5.5, 0),
|
|
left = Vec.new(3.15, 11.55, 0),
|
|
rltv_left = Vec.new(3.15, 5.5, 0)
|
|
},
|
|
head = Vec.new(0,6.3,0)
|
|
},
|
|
handlers = {},
|
|
mesh = "guns3d_character.b3d"
|
|
}
|
|
local player_model = Guns4d.player_model_handler
|
|
function player_model:set_default_handler()
|
|
assert(not self.instance, "cannot set default handler to an instance of a handler")
|
|
player_model.default_handler = self
|
|
end
|
|
function player_model:get_handler(meshname)
|
|
local selected_handler = player_model.handlers[meshname]
|
|
if selected_handler then return selected_handler end
|
|
return player_model.default_handler
|
|
end
|
|
function player_model:update()
|
|
assert(self.instance, "attempt to call object method on a class")
|
|
local player = self.player
|
|
local handler = Guns4d.players[player:get_player_name()].handler
|
|
local gun = handler.gun
|
|
local player_axial_offset = gun.offsets.total_offset_rotation.player_axial
|
|
local pitch = player_axial_offset.x+gun.offsets.player_rotation.x
|
|
local combined = player_axial_offset+gun.offsets.total_offset_rotation.gun_axial+Vec.new(gun.offsets.player_rotation.x,0,0)
|
|
local eye_pos = vector.new(0, handler:get_properties().eye_height*10, 0)
|
|
player:set_bone_position("guns3d_hipfire_bone", self.offsets.arm.rltv_right, vector.new(-(pitch*gun.consts.HIP_PLAYER_GUN_ROT_RATIO), 180-player_axial_offset.y, 0))
|
|
player:set_bone_position("guns3d_aiming_bone", eye_pos, vector.new(pitch, 180-player_axial_offset.y, 0))
|
|
player:set_bone_position("guns3d_reticle_bone", eye_pos, vector.new(combined.x, 180-combined.y, 0))
|
|
player:set_bone_position("guns3d_head", self.offsets.head, {x=pitch,z=0,y=0})
|
|
end
|
|
function player_model:prepare_deletion()
|
|
assert(self.instance, "attempt to call object method on a class")
|
|
local handler = Guns4d.players[self.player:get_player_name()].handler
|
|
local properties = handler:get_properties()
|
|
if minetest.get_modpath("player_api") then
|
|
player_api.set_model(self.player, self.old)
|
|
end
|
|
properties.mesh = self.old
|
|
handler:set_properties(properties)
|
|
end
|
|
---@diagnostic disable-next-line: duplicate-set-field
|
|
function player_model.construct(def)
|
|
if def.instance then
|
|
assert(def.mesh, "model has no mesh")
|
|
assert(def.player, "no player provided")
|
|
local handler = Guns4d.players[def.player:get_player_name()].handler
|
|
local properties = handler:get_properties()
|
|
def.old = properties.mesh
|
|
--set the model
|
|
if minetest.get_modpath("player_api") then
|
|
player_api.set_model(def.player, def.mesh)
|
|
end
|
|
properties.mesh = def.mesh
|
|
handler:set_properties(properties)
|
|
else
|
|
if def.replace then
|
|
player_model.handlers[def.replace] = def
|
|
end
|
|
end
|
|
end
|
|
Guns4d.player_model_handler = Instantiatable_class:inherit(player_model)
|
|
Guns4d.player_model_handler:set_default_handler()
|
|
|