add treatable cut wound

lotta stuff, don't feel like explaining, cheers
This commit is contained in:
Elkien3 2020-06-17 18:42:40 -05:00
parent 1e6f040bc8
commit 7797ad5d40
12 changed files with 368 additions and 103 deletions

View File

@ -1,3 +1,4 @@
minetest.register_entity("medical:body", { minetest.register_entity("medical:body", {
hp_max = 1, hp_max = 1,
physical = false, physical = false,
@ -10,62 +11,63 @@ minetest.register_entity("medical:body", {
makes_footstep_sound = false, makes_footstep_sound = false,
automatic_rotate = false, automatic_rotate = false,
on_activate = function(self, staticdata, dtime_s) on_activate = function(self, staticdata, dtime_s)
if not staticdata or staticdata == "" then staticdata = "Elkien" end--return end
--self.object:set_acceleration({x=0, y=-10, z=0})
self.owner = staticdata
self.object:set_animation({x=162,y=167}, 1) self.object:set_animation({x=162,y=167}, 1)
self.object:set_armor_groups({immortal = 1}) self.object:set_armor_groups({immortal = 1})
self.object:set_yaw(math.random(-math.pi, math.pi)) self.object:set_yaw(math.random(-math.pi, math.pi)) --todo: have a set rotation value
medical.init_injuries(self)
end, end,
--[[get_staticdata = function(self) --[[get_staticdata = function(self)
--return --return
end,--]] end,--]]
on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir) on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
if not puncher:is_player() then return end if not puncher:is_player() then return end
local name = puncher:get_player_name()
local wielditem = puncher:get_wielded_item() local wielditem = puncher:get_wielded_item()
local wieldname = wielditem:get_name() local wieldname = wielditem:get_name()
local hitloc, local_hitloc = medical.gethitloc(self.object, puncher, tool_capabilities, dir) local hitloc, local_hitloc = medical.gethitloc(self.object, puncher, tool_capabilities, dir)
if medical.attachedtools[wieldname] then local hitlimb = medical.getlimb(self.object, puncher, tool_capabilities, dir, hitloc)
medical.attachedtools[wieldname](self, puncher, wielditem, hitloc, local_hitloc) if not puncher:get_player_control(puncher).sneak and medical.attachedtools[wieldname] and medical.attachedtools[wieldname](self, puncher, wielditem, hitloc, local_hitloc) then
elseif medical.data[name].injuries and medical.data[name].injuries[hitlimb] then
medical.injury_handle(self.owner, puncher, false, wieldname, hitlimb)
end end
-- attach things -- attach things
end, end,
on_rightclick = function(self, clicker) on_rightclick = function(self, clicker)
if not clicker:is_player() then return end if not clicker:is_player() then return end
local name = clicker:get_player_name()
local wielditem = clicker:get_wielded_item() local wielditem = clicker:get_wielded_item()
local wieldname = wielditem:get_name() local wieldname = wielditem:get_name()
local hitloc, local_hitloc = medical.gethitloc(self.object, clicker, nil, nil) local hitloc, local_hitloc = medical.gethitloc(self.object, clicker, nil, nil)
if medical.usedtools[wieldname] then local hitlimb = medical.getlimb(self.object, clicker, tool_capabilities, dir, hitloc)
medical.usedtools[wieldname](self, clicker, wielditem, hitloc, local_hitloc) if not clicker:get_player_control(clicker).sneak and medical.usedtools[wieldname] and medical.usedtools[wieldname](self, clicker, wielditem, hitloc, local_hitloc) then
elseif medical.data[name].injuries and medical.data[name].injuries[hitlimb] then
medical.injury_handle(self.owner, clicker, true, wieldname, hitlimb)
end end
-- use things -- use things
end end
}) })
--open fracture test local injuryflip = {Arm_Right = 180, Arm_Left = 180, Leg_Right = 180, Leg_Left = 180}
minetest.register_entity("medical:fracturetest", { local injurypos = {Head = -1.2}
hp_max = 1,
physical = true, function medical.init_injuries(self)
weight = 5, local name = self.owner
collisionbox = {-0.1,-0.1,-0.1, 0.1,0.1,0.1}, local player = minetest.get_player_by_name(name)
visual = "mesh", local data = medical.data[name]
mesh = "bone.b3d", local pos = self.object:get_pos()
visual_size = {x=1, y=1},--{x=.211, y=.211}, if medical.data[name].injuries then
textures = {"default_clay.png","default_clay.png","default_clay.png","default_clay.png","default_clay.png","default_clay.png"}, -- number of required textures depends on visual for bone, injury in pairs (medical.data[name].injuries) do
colors = {}, -- number of required colors depends on visual local injurydef = medical.injuries[injury.name]
spritediv = {x=1, y=1}, local ent = minetest.add_entity(pos, injurydef.entity, minetest.serialize({owner = name, bone = bone}))
initial_sprite_basepos = {x=0, y=0}, local rot = injuryflip[bone] or 0
is_visible = true, local pos = injurypos[bone] or 0
makes_footstep_sound = false, ent:set_attach(self.object, bone, {x=0, y=2, z=pos}, {x=rot,y=0,z=math.random(-10, 10)})
automatic_rotate = false, medical.data[name].injuries[bone].ent = ent
on_activate = function(self, staticdata, dtime_s)
minetest.after(1, function()
local all_objects = minetest.get_objects_inside_radius(self.object:get_pos(), 10)
local _,obj
for _,obj in ipairs(all_objects) do
if obj:get_entity_name() == "medical:body" then
minetest.chat_send_all(obj:get_entity_name())
self.object:set_attach(obj, "Arm_Right", {x=0,y=4,z=0}, {x=1,y=0,z=math.random(-10, 10)})
break
end end
end end
end) end
end
})

View File

@ -1,32 +1,20 @@
local limb_location = {} --standing locations
local limb = {}
limb["standing"]= {Head = {x=0,y=1.6,z=0}, Body = {x=0,y=1,z=0}, Arm_Right = {x=.3,y=1,z=0}, Arm_Left = {x=-.3,y=1,z=0}, Leg_Right = {x=.1,y=.4,z=0}, Leg_Left = {x=-.1,y=.4,z=0}}
-- sitting locations
limb["sitting"] = {Head = {x=0,y=.9,z=0}, Body = {x=0,y=.4,z=0}, Arm_Right = {x=.3,y=.4,z=0}, Arm_Left = {x=-.3,y=.4,z=0}, Leg_Right = {x=.1,y=.1,z=.35}, Leg_Left = {x=-.1,y=.1,z=.35}}
--todo: make these change depending on what state the patient is in.
--[[ standing locations
limb_location.head = {x=0,y=1.6,z=0}
limb_location.torso = {x=0,y=1,z=0}
limb_location.rightarm = {x=.3,y=1,z=0}
limb_location.leftarm = {x=-.3,y=1,z=0}
limb_location.rightleg = {x=.1,y=.4,z=0}
limb_location.leftleg = {x=-.1,y=.4,z=0}
--]]
--[[ sitting locations
limb_location.head = {x=0,y=.9,z=0}
limb_location.torso = {x=0,y=.4,z=0}
limb_location.rightarm = {x=.3,y=.4,z=0}
limb_location.leftarm = {x=-.3,y=.4,z=0}
limb_location.rightleg = {x=.1,y=.1,z=.35}
limb_location.leftleg = {x=-.1,y=.1,z=.35}
--]]
-- laying locations -- laying locations
limb_location.head = {x=0,y=.1,z=-.65} limb["laying"] = {Head = {x=0,y=.1,z=-.65}, Body = {x=0,y=.1,z=-.2}, Arm_Right = {x=.4,y=.1,z=-.125}, Arm_Left = {x=-.4,y=.1,z=-.125}, Leg_Right = {x=.2,y=.1,z=.5}, Leg_Left = {x=-.2,y=.1,z=.5}}
limb_location.torso = {x=0,y=.1,z=-.2}
limb_location.rightarm = {x=.4,y=.1,z=-.125}
limb_location.leftarm = {x=-.4,y=.1,z=-.125}
limb_location.rightleg = {x=.2,y=.1,z=.5}
limb_location.leftleg = {x=-.2,y=.1,z=.5}
local DEBUG_WAYPOINT = true function medical.get_limb_locations(self)
local DEBUG_CHAT = true --todo: make these change depending on what state the patient is in.
return limb["laying"]
end
local DEBUG_WAYPOINT = false
local DEBUG_CHAT = false
local function rotateVector(x, y, a) local function rotateVector(x, y, a)
local c = math.cos(a) local c = math.cos(a)
@ -131,7 +119,7 @@ function medical.getlimb(player, hitter, tool_capabilities, dir, hitloc)
else else
playeryaw = player:get_yaw() playeryaw = player:get_yaw()
end end
for id, pos in pairs(limb_location) do for id, pos in pairs(medical.get_limb_locations(player)) do
local x, z = rotateVector(pos.x, pos.z, playeryaw) local x, z = rotateVector(pos.x, pos.z, playeryaw)
local rot_pos = {x=x,y=pos.y,z=z} local rot_pos = {x=x,y=pos.y,z=z}
local adj_pos = vector.add(playerpos, rot_pos) local adj_pos = vector.add(playerpos, rot_pos)

View File

@ -2,17 +2,17 @@ medical = {}
medical.mod_storage = minetest.get_mod_storage() medical.mod_storage = minetest.get_mod_storage()
medical.usedtools = {} medical.usedtools = {}
medical.attachedtools = {} medical.attachedtools = {}
medical.data = medical.mod_storage:to_table() or {} medical.data = minetest.deserialize(medical.mod_storage:get_string("data")) or {}
if not medical.data.vitals then medical.data.vitals = {} end
if not medical.data.injuries then medical.data.injuries = {} end
--mod_storage:from_table(medical)
local modpath = minetest.get_modpath(minetest.get_current_modname()) local modpath = minetest.get_modpath(minetest.get_current_modname())
dofile(modpath.."/timers.lua")
dofile(modpath.."/controls.lua") dofile(modpath.."/controls.lua")
dofile(modpath.."/timers.lua")
dofile(modpath.."/vitals.lua") dofile(modpath.."/vitals.lua")
dofile(modpath.."/hitloc.lua") dofile(modpath.."/hitloc.lua")
dofile(modpath.."/body.lua") dofile(modpath.."/body.lua")
dofile(modpath.."/tools.lua") dofile(modpath.."/tools.lua")
dofile(modpath.."/injuries.lua")
medical.data["Elkien"] = {}
medical.data["Elkien"].injuries = {Arm_Left = {name = "cut"}}

111
injuries.lua Normal file
View File

@ -0,0 +1,111 @@
medical.injuries = {}
function medical.injury_handle(owner, player, rightclick, tool, hitlimb, finish)
local name = player:get_player_name()
local injury = medical.data[owner].injuries[hitlimb]
local injurydef = medical.injuries[injury.name]
if not injury.step then injury.step = 1 end
local stepdef = injurydef.steps[injury.step]
if finish then
injury.step = injury.step + 1
if not injurydef.steps[injury.step] then
if injury.ent then
injury.ent:remove()
medical.data[owner].injuries[hitlimb] = nil
end
return
end
if tool ~= stepdef.tool or rightclick ~= stepdef.rightclick then
return end
end
local stopfunc
local stoparg
if stepdef.hud then
medical.hud[name] = player:hud_add({
hud_elem_type = "image",
position = {x = 0.5, y = 0.55},
offset = {x = 0, y = 0},
text = stepdef.hud,
scale = { x = 10, y = 10},
alignment = { x = 0, y = 0 },
})
player:hud_set_flags({wielditem=false})
stoparg = name
stopfunc = function(stoparg)
local player = minetest.get_player_by_name(stoparg)
if medical.hud[stoparg] then
player:hud_remove(medical.hud[stoparg])
medical.hud[stoparg] = nil
player:hud_set_flags({wielditem=true})
end
end
end
if stepdef.time then
medical.start_timer(owner, stepdef.time, false, {owner, player, rightclick, tool, hitlimb, true}, medical.injury_handle, stoparg, stopfunc, "RMB", name)
else
medical.injury_handle(owner, player, rightclick, tool, hitlimb, true)
end
end
minetest.register_entity("medical:cut", {
hp_max = 1,
physical = false,
weight = 5,
collisionbox = {-0.1,-0.1,-0.1, 0.1,0.1,0.1},
visual = "cube",
visual_size = {x=.211, y=.211},
textures = {"invis.png", "invis.png", "invis.png", "invis.png", "invis.png", "medical_cut.png"}, -- number of required textures depends on visual -- number of required textures depends on visual
colors = {}, -- number of required colors depends on visual
spritediv = {x=1, y=1},
initial_sprite_basepos = {x=0, y=0},
is_visible = true,
makes_footstep_sound = false,
automatic_rotate = false,
on_activate = function(self, staticdata, dtime_s)
if not staticdata or staticdata == "" then self.object:remove() return end
local data = minetest.deserialize(staticdata)
self.owner = data.owner
self.bone = data.bone
end
})
medical.injuries["cut"] = {
entity = "medical:cut",
steps = {{tool = "", rightclick = true, time = 5, hud = "applypressure.png"}},--steps = {"medical:dressing", "", "medical:dressing", "", "medical:tourniquet", ""},-- maybe make the optional steps removed if the initial severety of the wound is less severe. would need a way to make sure the player knows thta in real life tourniquets should only be applied in real situation only if neccisary and you know how, and should only be removed by professionals, lest bleeding start again.
--vitals = {depends on severity and current treatment},
healtime = nil,-- maybe make a severity value that starts at 1 or something, and goes down as you treat, or if the wound is less severe to start with.
medical_step = nil,
}
--open fracture test
minetest.register_entity("medical:fracturetest", {
hp_max = 1,
physical = true,
weight = 5,
collisionbox = {-0.1,-0.1,-0.1, 0.1,0.1,0.1},
visual = "mesh",
mesh = "bone.b3d",
visual_size = {x=1, y=1},--{x=.211, y=.211},
textures = {"default_clay.png","default_clay.png","default_clay.png","default_clay.png","default_clay.png","default_clay.png"}, -- number of required textures depends on visual
colors = {}, -- number of required colors depends on visual
spritediv = {x=1, y=1},
initial_sprite_basepos = {x=0, y=0},
is_visible = true,
makes_footstep_sound = false,
automatic_rotate = false,
on_activate = function(self, staticdata, dtime_s)
minetest.after(1, function()
self.object:remove()
local all_objects = minetest.get_objects_inside_radius(self.object:get_pos(), 10)
local _,obj
for _,obj in ipairs(all_objects) do
if obj:get_entity_name() == "medical:body" then
minetest.chat_send_all(obj:get_entity_name())
self.object:set_attach(obj, "Arm_Right", {x=0,y=4,z=0}, {x=1,y=0,z=math.random(-10, 10)})
break
end
end
end)
end
})

BIN
textures/applypressure.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
textures/blackline.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 546 B

BIN
textures/bpcuff.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
textures/bpcuffbladder.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
textures/medical_cut.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 855 B

View File

@ -1,6 +1,6 @@
medical.timers = {} medical.timers = {}
function medical.start_timer(name, length, loop, arg, func) function medical.start_timer(name, length, loop, arg, func, stoparg, stopfunc, cancel_on_release, cancel_owner)
local index local index
if name then if name then
index = name index = name
@ -20,14 +20,33 @@ function medical.start_timer(name, length, loop, arg, func)
medical.timers[index].loop = loop medical.timers[index].loop = loop
medical.timers[index].arg = arg medical.timers[index].arg = arg
medical.timers[index].func = func medical.timers[index].func = func
medical.timers[index].stoparg = stoparg
medical.timers[index].stopfunc = stopfunc
if cancel_owner and cancel_on_release then
medical.timers[index].cancel_on_release = cancel_on_release
medical.timers[index].cancel_owner = cancel_owner
local player = minetest.get_player_by_name(cancel_owner)
if player and not medical.lookingplayer[cancel_owner] then medical.lookingplayer[cancel_owner] = {dir = player:get_look_dir(), pos = player:get_pos()} end
end
return index return index
end end
function medical.stop_timer(name, runonce) function medical.stop_timer(name, runonce)
local timer = medical.timers[name] local timer = medical.timers[name]
if runonce then if runonce then
if type(timer.arg) == "table" then
timer.func(unpack(timer.arg))
else
timer.func(timer.arg) timer.func(timer.arg)
end end
end
if timer.stopfunc then
if type(timer.stoparg) == "table" then
timer.stopfunc(unpack(timer.stoparg))
else
timer.stopfunc(timer.stoparg)
end
end
medical.timers[name] = nil medical.timers[name] = nil
end end
@ -35,12 +54,32 @@ minetest.register_globalstep(function(dtime)
for index, timer in pairs (medical.timers) do for index, timer in pairs (medical.timers) do
timer.timeleft = timer.timeleft - dtime timer.timeleft = timer.timeleft - dtime
if timer.timeleft <= 0 then if timer.timeleft <= 0 then
timer.func(timer.arg) if type(timer.arg) == "table" then
if timer.loop then timer.func(unpack(timer.arg))
medical.start_timer(index, timer.length, timer.loop, timer.arg, timer.func)
else else
medical.stoptimer(name) timer.func(timer.arg)
end
if timer.loop then
medical.start_timer(index, timer.length, timer.loop, timer.arg, timer.func, timer.stoparg, timer.stopfunc, timer.cancel_on_release, timer.cancel_owner)
else
medical.stop_timer(index)
end end
end end
end end
end) end)
controls.register_on_release(function(player, key, time)
local name = player:get_player_name()
for index, timer in pairs (medical.timers) do
if name == timer.cancel_owner and timer.cancel_on_release == key then
medical.stop_timer(index)
end
end
end)
medical.register_on_lookaway(function(player, name)
for index, timer in pairs (medical.timers) do
if name == timer.cancel_owner and timer.cancel_on_release then
medical.stop_timer(index)
end
end
end)

145
tools.lua
View File

@ -9,10 +9,10 @@ medical.usedtools[""] = function(self, clicker, wielditem, hitloc, local_hitloc)
vitalpoints.pedalright = {x=.20,y=.1,z=.7} vitalpoints.pedalright = {x=.20,y=.1,z=.7}
vitalpoints.pedalleft = {x=-.20,y=.1,z=.7} vitalpoints.pedalleft = {x=-.20,y=.1,z=.7}
local distance, hitpart = medical.getclosest(vitalpoints, local_hitloc) local distance, hitpart = medical.getclosest(vitalpoints, local_hitloc)
if distance > .15 then return end if distance > .15 then return false end
local cname = clicker:get_player_name() local cname = clicker:get_player_name()
local sname = self.owner
if medical.hud[cname] then clicker:hud_remove(medical.hud[cname]) medical.hud[cname] = nil end if medical.hud[cname] then clicker:hud_remove(medical.hud[cname]) medical.hud[cname] = nil end
if not medical.lookingplayer[cname] then medical.lookingplayer[cname] = {dir = clicker:get_look_dir(), pos = clicker:get_pos()} end
medical.hud[cname] = clicker:hud_add({ medical.hud[cname] = clicker:hud_add({
hud_elem_type = "image", hud_elem_type = "image",
position = {x = 0.5, y = 0.55}, position = {x = 0.5, y = 0.55},
@ -21,7 +21,8 @@ medical.usedtools[""] = function(self, clicker, wielditem, hitloc, local_hitloc)
scale = { x = 10, y = 10}, scale = { x = 10, y = 10},
alignment = { x = 0, y = 0 }, alignment = { x = 0, y = 0 },
}) })
medical.start_timer(cname.."pulsecheck", 60/medical.data.vitals[cname].pulse, true, cname, --todo: change this to give the patient's pulse instead of yours clicker:hud_set_flags({wielditem=false})
medical.start_timer(sname.."pulsecheck", 60/medical.data[sname].vitals.pulse, true, sname,
function(arg) function(arg)
minetest.sound_play("human-heartbeat-daniel_simon", { minetest.sound_play("human-heartbeat-daniel_simon", {
pos = hitloc, pos = hitloc,
@ -41,23 +42,133 @@ medical.usedtools[""] = function(self, clicker, wielditem, hitloc, local_hitloc)
hitter:hud_remove(circle) hitter:hud_remove(circle)
end end
end) end)
end,
cname,
function(stoparg)
local player = minetest.get_player_by_name(stoparg)
if medical.hud[stoparg] then
player:hud_remove(medical.hud[stoparg])
medical.hud[stoparg] = nil
player:hud_set_flags({wielditem=true})
end end
end, "RMB", cname
) )
return true
end
medical.attachedtools[""] = function(self, clicker, wielditem, hitloc, local_hitloc)
--local limb = medical.getlimb(self.object, clicker, nil, nil, hitloc)
local all_objects = minetest.get_objects_inside_radius(hitloc, 10)
local cname = clicker:get_player_name()
for _,obj in ipairs(all_objects) do
local pos = obj:get_pos()
local marker = clicker:hud_add({
hud_elem_type = "waypoint",
name = obj:get_entity_name(),
number = 0xFF0000,
world_pos = obj:get_pos()
})
minetest.after(5, function()
local hitter = minetest.get_player_by_name(cname)
if hitter then
hitter:hud_remove(marker)
end
end)
end
end end
controls.register_on_release(function(player, key, time) minetest.register_tool("medical:bpcuff", {
local name = player:get_player_name() description = "Blood Pressure Cuff",
if key == "RMB" and medical.hud[name] then inventory_image = "bpcuff.png",
player:hud_remove(medical.hud[name]) medical.hud[name] = nil })
medical.lookingplayer[name] = nil
medical.stop_timer(name.."pulsecheck", false) minetest.register_tool("medical:bpbladder", {
description = "Blood Pressure Cuff",
inventory_image = "bpcuffbladder.png",
on_use = function(itemstack, player, pointed_thing)
--inflate bp cuff
end end
end) })
medical.register_on_lookaway(function(player, name)
if medical.hud[name] then minetest.register_entity("medical:bpcuff", {
player:hud_remove(medical.hud[name]) hp_max = 1,
medical.hud[name] = nil physical = false,
medical.lookingplayer[name] = nil weight = 5,
medical.stop_timer(name.."pulsecheck", false) collisionbox = {-0.1,-0.1,-0.1, 0.1,0.1,0.1},
visual = "cube",
visual_size = {x=.25, y=.25},--{x=.211, y=.211},
textures = {"default_coal_block.png", "default_coal_block.png", "default_coal_block.png", "default_coal_block.png", "default_coal_block.png", "default_coal_block.png"}, -- number of required textures depends on visual
colors = {}, -- number of required colors depends on visual
spritediv = {x=1, y=1},
initial_sprite_basepos = {x=0, y=0},
is_visible = true,
makes_footstep_sound = false,
automatic_rotate = false,
on_activate = function(self, staticdata, dtime_s)
if not staticdata or staticdata == "" then self.object:remove() end
self.owner = staticdata
end end
end) })
minetest.register_entity("medical:line", {
hp_max = 1,
physical = false,
weight = 5,
collisionbox = {-0.1,-0.1,-0.1, 0.1,0.1,0.1},
visual = "cube",
visual_size = {x=.05, y=.1},
textures = {"blackline.png", "blackline.png", "blackline.png", "blackline.png", "blackline.png", "blackline.png"}, -- number of required textures depends on visual
colors = {}, -- number of required colors depends on visual
spritediv = {x=1, y=1},
initial_sprite_basepos = {x=0, y=0},
is_visible = true,
makes_footstep_sound = false,
automatic_rotate = false,
on_step = function(self, dtime)
if not self.target or not self.owner then self.object:remove() return end
local player = minetest.get_player_by_name(self.owner)
local op = player:get_pos()
op.y = op.y + 1
op = vector.add(op, vector.multiply(player:get_player_velocity(), .1))
if self.lastpos and vector.equals(self.lastpos, op) then return end
local tp = self.target
if vector.distance(op, tp) > 1.5 then
local inv = player:get_inventory()
local list = "main"
return
end
local delta = vector.subtract(op, tp)
local yaw = math.atan2(delta.z, delta.x) - math.pi / 2
local pitch = math.atan2(delta.y, math.sqrt(delta.z*delta.z + delta.x*delta.x))
pitch = pitch + math.pi/2
self.object:move_to({x=(op.x+tp.x)/2, y=(op.y+tp.y)/2, z=(op.z+tp.z)/2, })
self.object:set_rotation({x=pitch, y=yaw, z=0})
self.object:set_properties({visual_size = {x=.05, y=vector.distance(tp, op)}})
self.lastpos = op
end,
on_activate = function(self, staticdata, dtime_s)
if not staticdata or staticdata == "" then self.object:remove() end
self.owner = staticdata
self.target = self.object:get_pos()
end
})
medical.attachedtools["medical:bpcuff"] = function(self, clicker, wielditem, hitloc, local_hitloc)
local limb = medical.getlimb(self.object, clicker, nil, nil, hitloc)
local bone
if limb == "rightarm" then bone = "Arm_Right" elseif limb == "leftarm" then bone = "Arm_Left" else return end
local pos = self.object:get_pos()
local obj = minetest.add_entity(pos, "medical:bpcuff", clicker:get_player_name())
minetest.after(0, function()
local marker = clicker:hud_add({
hud_elem_type = "waypoint",
name = "hit",
number = 0xFF0000,
world_pos = obj:get_pos()
}) end)
obj:set_attach(self.object, bone, {x=0,y=.5,z=0}, {x=0,y=0,z=0})
--local obj = minetest.add_entity(hitloc, "medical:line", clicker:get_player_name())
minetest.after(0, function() clicker:set_wielded_item({name = ""})end)
end

View File

@ -8,22 +8,36 @@ default_vitals.volume = 5000 --milliliters
default_vitals.systolic = 110 --mmHg default_vitals.systolic = 110 --mmHg
default_vitals.diastolic = 70 --mmHg default_vitals.diastolic = 70 --mmHg
minetest.register_on_joinplayer(function(player)
local name = player:get_player_name()
if not medical.data[name] then
medical.data[name] = {}
end
if not medical.data[name].vitals then
medical.data[name].vitals = default_vitals
end
end)
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)
timer = timer + dtime; timer = timer + dtime;
if timer >= 5 then if timer >= 5 then
for _,player in ipairs(minetest.get_connected_players()) do for _,player in ipairs(minetest.get_connected_players()) do
--player:set_bone_position("Head", {x=0,y=10,z=0}, {x=0,y=180,z=0})
--local bonepos = player:get_bone_position("Head")
--[[local text = ""
for id, data in pairs (bonepos) do
text = text.." "..tostring(id)..":"..dump(data)
end
minetest.chat_send_all(text)--]]
local name = player:get_player_name() local name = player:get_player_name()
if not medical.data.vitals[name] then medical.data.vitals[name] = default_vitals end
if medical.data.injuries[name] then if medical.data[name].injuries then
--handle loss of vital signs due to injuries --handle loss of vital signs due to injuries
for index, injury in pairs (medical.data[name].injuries) do
local injurydef = medical.injuries[injury.name]
if injurydef.medical_step then
injurydef.medical_step()
end
if injury.vitals then
for vital, amount in pairs (injury.vitals) do
medical.data[name].vitals[vital] = medical.data[name].vitals[vital] - amount
end
end
--handle loss of vital signs due to injuries
end
end end
if hunger then if hunger then
@ -34,7 +48,7 @@ minetest.register_globalstep(function(dtime)
--handle thirst things --handle thirst things
end end
mv = medical.data.vitals[name] local mv = medical.data[name].vitals
local perfusion = ((mv.oxygen-60)/34) * ((mv.pulse-30)/40) * ((mv.volume-2000)/3000) * ((mv.temp-70)/28) local perfusion = ((mv.oxygen-60)/34) * ((mv.pulse-30)/40) * ((mv.volume-2000)/3000) * ((mv.temp-70)/28)
if perfusion < .9 then --compensate by raising pulse and respiratory rate if perfusion < .9 then --compensate by raising pulse and respiratory rate