forked from mtcontrib/maidroid
commit
711c9ad9f7
@ -95,8 +95,8 @@ function maidroid.maidroid.get_nearest_player(self, range_distance)
|
||||
return player
|
||||
end
|
||||
|
||||
-- maidroid.maidroid.get_front_node returns a node that exists in front of the maidroid.
|
||||
function maidroid.maidroid.get_front_node(self)
|
||||
-- maidroid.maidroid.get_front returns a position in front of the maidroid.
|
||||
function maidroid.maidroid.get_front(self)
|
||||
local direction = self:get_look_direction()
|
||||
if math.abs(direction.x) >= 0.5 then
|
||||
if direction.x > 0 then direction.x = 1 else direction.x = -1 end
|
||||
@ -110,7 +110,12 @@ function maidroid.maidroid.get_front_node(self)
|
||||
direction.z = 0
|
||||
end
|
||||
|
||||
local front = vector.add(vector.round(self.object:getpos()), direction)
|
||||
return vector.add(vector.round(self.object:getpos()), direction)
|
||||
end
|
||||
|
||||
-- maidroid.maidroid.get_front_node returns a node that exists in front of the maidroid.
|
||||
function maidroid.maidroid.get_front_node(self)
|
||||
local front = self:get_front()
|
||||
return minetest.get_node(front)
|
||||
end
|
||||
|
||||
@ -269,7 +274,7 @@ do
|
||||
local luaentity = obj:get_luaentity()
|
||||
|
||||
if maidroid.is_maidroid(luaentity.name) then
|
||||
self.object:set_attach(obj, "Arm_R", {x = 0.075, y = 0.60, z = -0.20}, {x = 0, y = 90, z = 0})
|
||||
self.object:set_attach(obj, "Arm_R", {x = 0.065, y = 0.50, z = -0.15}, {x = -45, y = 0, z = 0})
|
||||
self.object:set_properties{textures={"maidroid:dummy_empty_craftitem"}}
|
||||
return
|
||||
end
|
||||
@ -624,6 +629,7 @@ function maidroid.register_maidroid(product_name, def)
|
||||
get_core = maidroid.maidroid.get_core,
|
||||
get_core_name = maidroid.maidroid.get_core_name,
|
||||
get_nearest_player = maidroid.maidroid.get_nearest_player,
|
||||
get_front = maidroid.maidroid.get_front,
|
||||
get_front_node = maidroid.maidroid.get_front_node,
|
||||
get_look_direction = maidroid.maidroid.get_look_direction,
|
||||
set_animation = maidroid.maidroid.set_animation,
|
||||
|
136
maidroid_core/cores/torcher.lua
Normal file
136
maidroid_core/cores/torcher.lua
Normal file
@ -0,0 +1,136 @@
|
||||
------------------------------------------------------------
|
||||
-- Copyright (c) 2016 tacigar. All rights reserved.
|
||||
-- https://github.com/tacigar/maidroid
|
||||
------------------------------------------------------------
|
||||
|
||||
local state = {IDLE = 0, ACCOMPANY = 1}
|
||||
|
||||
local PLACE_TIME = 4
|
||||
|
||||
local function on_start(self)
|
||||
self.state = state.IDLE
|
||||
self.object:setacceleration{x = 0, y = -10, z = 0}
|
||||
self.object:setvelocity{x = 0, y = 0, z = 0}
|
||||
self.time_counter = -1
|
||||
self.is_placing = false
|
||||
end
|
||||
|
||||
local function on_stop(self)
|
||||
self.state = nil
|
||||
self.object:setvelocity{x = 0, y = 0, z = 0}
|
||||
self:set_animation(maidroid.animation_frames.STAND)
|
||||
self.time_counter = nil
|
||||
self.is_placing = nil
|
||||
end
|
||||
|
||||
local function is_dark(pos)
|
||||
local light_level = minetest.get_node_light(pos)
|
||||
return light_level <= 5
|
||||
end
|
||||
|
||||
local function on_step(self, dtime)
|
||||
if self.is_placing then
|
||||
if self.time_counter >= PLACE_TIME then
|
||||
self.time_counter = -1
|
||||
if self.state == state.IDLE then
|
||||
self:set_animation(maidroid.animation_frames.STAND)
|
||||
elseif self.state == state.ACCOMPANY then
|
||||
self:set_animation(maidroid.animation_frames.WALK)
|
||||
end
|
||||
|
||||
local owner = minetest.get_player_by_name(self.owner_name)
|
||||
local wield_stack = self:get_wield_item_stack()
|
||||
local front = self:get_front()
|
||||
|
||||
local pointed_thing = {
|
||||
type = "node",
|
||||
under = vector.add(front, {x = 0, y = -1, z = 0}),
|
||||
above = front,
|
||||
}
|
||||
|
||||
if wield_stack:get_name() == "default:torch" then
|
||||
local res_stack, success = minetest.item_place_node(wield_stack, owner, pointed_thing)
|
||||
if success then
|
||||
res_stack:take_item(1)
|
||||
self:set_wield_item_stack(res_stack)
|
||||
end
|
||||
end
|
||||
self.is_placing = false
|
||||
else
|
||||
self.time_counter = self.time_counter + 1
|
||||
end
|
||||
end
|
||||
|
||||
local player = self:get_nearest_player(10)
|
||||
if player == nil then
|
||||
self:set_animation(maidroid.animation_frames.STAND)
|
||||
return
|
||||
end
|
||||
|
||||
local position = self.object:getpos()
|
||||
local player_position = player:getpos()
|
||||
local direction = vector.subtract(player_position, position)
|
||||
local velocity = self.object:getvelocity()
|
||||
|
||||
if vector.length(direction) < 3 then
|
||||
if self.state == state.ACCOMPANY then
|
||||
self:set_animation(maidroid.animation_frames.STAND)
|
||||
self.state = state.IDLE
|
||||
self.object:setvelocity{x = 0, y = velocity.y, z = 0}
|
||||
end
|
||||
|
||||
if not self.is_placing then
|
||||
local front = self:get_front() -- if it is dark, set touch.
|
||||
local wield_stack = self:get_wield_item_stack()
|
||||
|
||||
if is_dark(front)
|
||||
and (wield_stack:get_name() == "default:torch"
|
||||
or self:move_main_to_wield(function (itemname) return itemname == "default:torch" end)) then
|
||||
self.time_counter = 0
|
||||
self.is_placing = true
|
||||
self:set_animation(maidroid.animation_frames.MINE)
|
||||
end
|
||||
end
|
||||
|
||||
else
|
||||
if self.state == state.IDLE then
|
||||
self:set_animation(maidroid.animation_frames.WALK)
|
||||
self.state = state.ACCOMPANY
|
||||
end
|
||||
self.object:setvelocity{x = direction.x, y = velocity.y, z = direction.z} -- TODO
|
||||
|
||||
if not self.is_placing then
|
||||
local front = self:get_front() -- if it is dark, set touch.
|
||||
local wield_stack = self:get_wield_item_stack()
|
||||
|
||||
if is_dark(front)
|
||||
and (wield_stack:get_name() == "default:torch"
|
||||
or self:move_main_to_wield(function (itemname) return itemname == "default:torch" end)) then
|
||||
self.time_counter = 0
|
||||
self.is_placing = true
|
||||
self:set_animation(maidroid.animation_frames.WALK_MINE)
|
||||
end
|
||||
end
|
||||
end
|
||||
self:set_yaw_by_direction(direction)
|
||||
|
||||
-- if maidroid is stoped by obstacle, the maidroid must jump.
|
||||
if velocity.y == 0 and self.state == state.ACCOMPANY then
|
||||
local front_node = self:get_front_node()
|
||||
if front_node.name ~= "air" and minetest.registered_nodes[front_node.name] ~= nil
|
||||
and minetest.registered_nodes[front_node.name].walkable then
|
||||
self.object:setvelocity{x = direction.x, y = 5, z = direction.z}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- register a definition of a new core.
|
||||
maidroid.register_core("maidroid_core:torcher", {
|
||||
description = "maidroid core : torcher",
|
||||
inventory_image = "maidroid_core_torcher.png",
|
||||
on_start = on_start,
|
||||
on_stop = on_stop,
|
||||
on_resume = on_start,
|
||||
on_pause = on_stop,
|
||||
on_step = on_step,
|
||||
})
|
@ -12,6 +12,7 @@ dofile(maidroid_core.modpath .. "/cores/_aux.lua")
|
||||
dofile(maidroid_core.modpath .. "/cores/empty.lua")
|
||||
dofile(maidroid_core.modpath .. "/cores/basic.lua")
|
||||
dofile(maidroid_core.modpath .. "/cores/farming.lua")
|
||||
dofile(maidroid_core.modpath .. "/cores/torcher.lua")
|
||||
if pdisc then
|
||||
dofile(maidroid_core.modpath .. "/cores/ocr.lua")
|
||||
end
|
||||
|
BIN
maidroid_core/textures/maidroid_core_torcher.png
Normal file
BIN
maidroid_core/textures/maidroid_core_torcher.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 864 B |
BIN
maidroid_core/xcf/maidroid_core_torcher.xcf
Normal file
BIN
maidroid_core/xcf/maidroid_core_torcher.xcf
Normal file
Binary file not shown.
@ -9,6 +9,7 @@ do -- register core writer
|
||||
["dye:red"] = "maidroid_core:basic",
|
||||
["dye:yellow"] = "maidroid_core:farming",
|
||||
["dye:white"] = "maidroid_core:ocr",
|
||||
["dye:orange"] = "maidroid_core:torcher"
|
||||
}
|
||||
|
||||
local node_box = {
|
||||
|
Loading…
Reference in New Issue
Block a user