From e7e158052f11cc0d42e50a75b24f10736c79e127 Mon Sep 17 00:00:00 2001 From: d Date: Tue, 31 May 2016 13:26:54 +0900 Subject: [PATCH] First commit --- .DS_Store | Bin 0 -> 6148 bytes _aux.lua | 17 ++++ api.lua | 159 ++++++++++++++++++++++++++++++ init.lua | 15 +++ maidroids.lua | 19 ++++ maidroids/maidroid.lua | 3 + models/maidroid.b3d | Bin 0 -> 120300 bytes models/maidroid.png | Bin 0 -> 971 bytes module_generator.lua | 10 ++ modules.lua | 12 +++ modules/_aux.lua | 64 ++++++++++++ modules/chasing_player_module.lua | 72 ++++++++++++++ modules/farming_module.lua | 125 +++++++++++++++++++++++ modules/lumberjack_module.lua | 132 +++++++++++++++++++++++++ textures/normal_maidroid.png | Bin 0 -> 229 bytes textures/normal_module.png | Bin 0 -> 379 bytes util.lua | 23 +++++ 17 files changed, 651 insertions(+) create mode 100644 .DS_Store create mode 100644 _aux.lua create mode 100644 api.lua create mode 100644 init.lua create mode 100644 maidroids.lua create mode 100644 maidroids/maidroid.lua create mode 100755 models/maidroid.b3d create mode 100755 models/maidroid.png create mode 100644 module_generator.lua create mode 100644 modules.lua create mode 100644 modules/_aux.lua create mode 100644 modules/chasing_player_module.lua create mode 100644 modules/farming_module.lua create mode 100644 modules/lumberjack_module.lua create mode 100755 textures/normal_maidroid.png create mode 100755 textures/normal_module.png create mode 100644 util.lua diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..14a15a24afedb9e3f39906eb9ebcaa9ad3a319ba GIT binary patch literal 6148 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 S>$f5L{QE-!E5CZ;xcxtD{tY_- literal 0 HcmV?d00001 diff --git a/models/maidroid.png b/models/maidroid.png new file mode 100755 index 0000000000000000000000000000000000000000..d9c5f774deb642223343d2f67d6abb24dc313201 GIT binary patch literal 971 zcmV;+12p`JP)A0S|v7OwyR16WB! zK~z}7)mS}j(?A$~b}fY3ZXneIWFstD8X?hE2&qlPP>ED-M~WaDNUR{17KuuTpDavt zOMxI364O*LB@76~AXR0_P@1hUn2Juo*qFgR_k20qcTW1llOn~RefIPB`_9VFM#BMs zzT_B=BD8~k;N>g#0RV6BWqtO(pBP76c|3;c@58V z#4%Aety-E3C9t;Xgq}|)=0ndLh7qec2$X@L5hv=R?1i&jd+pOV+&bS1UHhQ05-S>{ z2(^jqWaPqYGbw(nINk()KRw(&n4d{?go(zNCHZ0q!lmI8ln1xP2-4(i+f8;|*S&LL z zWSXWgj5JZpvZP0sEEJ*#qh{|xV71=p7@6u}5|VB+`$2YX({a;edfH8yN(F{tU{LqB zpT9ppbA`tLAz0&hj^sY-JQwzlaYolpW7is(fGdY0?D?#=BeAsu7+fafB(m zX=jN=^*{j7!t#$5tNEFfv=>F&Px9FI-bRb6XjQ}uB;gIiK(#a{^yWR&gOy6fVZ&#d zruX(gKF)W!Z&m`YNhcJXy6BF;l~?oJ&vPm-xAtQrlujtVpR^tfOXyyZV-*mweW<+$ z01OO`cvFSm>!|EksIWc8YP}(?W_WWu>>llwJ4|}m0QH? zVhy+RS@96Z{eCBcOeTY^^(@+O32v>w05Z>oX0sMl7&84%1oc`C 0.5 then + if forward.x > 0 then rforward.x = 1 + else rforward.x = -1 end + end + if math.abs((forward.z / (math.abs(forward.x) + math.abs(forward.z)))) > 0.5 then + if forward.z > 0 then rforward.z = 1 + else rforward.z = -1 end + end + return rforward +end + +-- 真下の位置を返すだけ +function maidroid.modules._aux.get_under_pos(vec) + return { x = vec.x, y = vec.y - 1, z = vec.z } +end + +-- 真上の位置を返すだけ +function maidroid.modules._aux.get_upper_pos(vec) + return { x = vec.x, y = vec.y + 1, z = vec.z } +end + +-- 落ちているアイテムを拾う +function maidroid.modules._aux.get_item(self, radius, target_pred) + local pos = self.object:getpos() + local pred = target_list or (function() return true end) + local all_objects = minetest.get_objects_inside_radius(pos, radius) + for _, obj in ipairs(all_objects) do + if not obj:is_player() and obj:get_luaentity() then + local itemstring = obj:get_luaentity().itemstring + if itemstring then + if pred(itemstring) then + local inv = maidroid._aux.get_maidroid_inventory(self) + local stack = ItemStack(itemstring) + local leftover = inv:add_item("main", stack) + end + end + end + end +end diff --git a/modules/chasing_player_module.lua b/modules/chasing_player_module.lua new file mode 100644 index 0000000..b8f54d1 --- /dev/null +++ b/modules/chasing_player_module.lua @@ -0,0 +1,72 @@ +------------------------------------------------------------ +-- Copyright (c) 2016 tacigar +-- https://github.com/tacigar/maidroid +------------------------------------------------------------ + +local util = maidroid.util +local _aux = maidroid.modules._aux + +local state = { idle = 0, chase = 1} +local view_of_range = 7 -- 発見可能距離 +local stop_of_range = 2 -- 止まる距離 + +-- プレーヤを追跡するだけのモジュール +maidroid.register_module("maidroid:chasing_player_module", { + description = "Maidroid Module : Chasing Player", + inventory_image = "maidroid_chasing_player_module.png", + initialize = function(self) + self.state = state.idle + self.object:setacceleration{x = 0, y = -10, z = 0} + self.object:setvelocity{x = 0, y = 0, z = 0} + end, + finalize = function(self) + self.state = nil + self.object:setvelocity{x = 0, y = 0, z = 0} + end, + on_step = function(self, dtime) + local pos = self.object:getpos() + local all_objects = minetest.get_objects_inside_radius(pos, view_of_range) + local player = nil + for _, obj in pairs(all_objects) do + if obj:is_player() then player = obj; break end + end + if not player then + self.object:set_animation(maidroid.animations.stand, 15, 0) + self.state = state.idle + return + end + local ppos = player:getpos() + local dir = vector.subtract(ppos, pos) + local vel = self.object:getvelocity() + if (vector.length(dir) < stop_of_range) then + if self.state == state.chase then + self.object:set_animation(maidroid.animations.stand, 15, 0) + self.state = state.idle + self.object:setvelocity({x = 0, y = vel.y, z = 0}) + end + else + if self.state == state.idle then + self.object:set_animation(maidroid.animations.walk, 15, 0) + self.state = state.chase + end + self.object:setvelocity({x = dir.x, y = vel.y, z = dir.z}) + end + local yaw = math.atan2(dir.z, dir.x) + math.pi/2 + self.object:setyaw(yaw) + -- jump process + if vel.y == 0 and self.state == state.chase then + local rdir = vector.round(dir) + local front_vec = { x = 0, y = 0, z = 0 } + if math.abs((rdir.x / (math.abs(rdir.x) + math.abs(rdir.z)))) > 0.5 then + if rdir.x > 0 then front_vec.x = 1 else front_vec.x = -1 end + end + if math.abs((rdir.z / (math.abs(rdir.x) + math.abs(rdir.z)))) > 0.5 then + if rdir.z > 0 then front_vec.z = 1 else front_vec.z = -1 end + end + local front_pos = vector.add(vector.round(pos), front_vec) + if minetest.get_node(front_pos).name ~= "air" then + self.object:setvelocity({x = dir.x, y = 5, z = dir.z}) + end + end + end, +}) diff --git a/modules/farming_module.lua b/modules/farming_module.lua new file mode 100644 index 0000000..0625768 --- /dev/null +++ b/modules/farming_module.lua @@ -0,0 +1,125 @@ +------------------------------------------------------------ +-- Copyright (c) 2016 tacigar +-- https://github.com/tacigar/maidroid +------------------------------------------------------------ + +local _aux = maidroid.modules._aux +local state = {walk = 0, punch = 1, plant = 2} + +-- 各植物ノードの種類の最大番号を探し出す +local target_plants_list = {} +minetest.after(0, function() + local max = {} + for name, node in pairs(minetest.registered_nodes) do + if minetest.get_item_group(name, "plant") > 0 then + local s, i = string.match(name, "(.+)_(%d+)") + if max[s] == nil or max[s] < i then max[s] = i end + end + end + for s, i in pairs(max) do + table.insert(target_plants_list, s.."_"..i) + end +end) + +local max_punch_time = 20 +local max_plant_time = 15 + +-- 種を持っているか否かを確認する +local function has_seed_item(self) + local inv = maidroid._aux.get_maidroid_inventory(self) + local stacks = inv:get_list("main") + for _, stack in ipairs(stacks) do + local item_name = stack:get_name() + if minetest.get_item_group(item_name, "seed") > 0 then + return true + end + end + return false +end + +-- 農業を行うモジュール +maidroid.register_module("maidroid:farming_module", { + description = "Maidroid Module : Farming", + inventory_image = "maidroid_farming_module.png", + initialize = function(self) + self.object:set_animation(maidroid.animations.walk, 15, 0) + self.object:setacceleration{x = 0, y = -10, z = 0} + self.state = state.walk + self.preposition = self.object:getpos() + self.time_count = 0 + _aux.change_dir(self) + end, + finalize = function(self) + self.state = nil + self.preposition = nil + self.time_count = nil + self.object:setvelocity{x = 0, y = 0, z = 0} + end, + on_step = function(self, dtime) + local pos = self.object:getpos() + local rpos = vector.round(pos) + local yaw = self.object:getyaw() + local forward_vec = _aux.get_forward(yaw) + local forward_vec2 = _aux.get_round_forward(forward_vec) + local forward_pos = vector.add(rpos, forward_vec2) + local forward_node = minetest.get_node(forward_pos) + local forward_under_pos = vector.subtract(forward_pos, {x = 0, y = 1, z = 0}) + if self.state == state.walk then -- searching plants or spaces + if maidroid.util.table_find_value(target_plants_list, forward_node.name) then + self.state = state.punch + self.object:set_animation(maidroid.animations.mine, 15, 0) + self.object:setvelocity{x = 0, y = 0, z = 0} + elseif pos.x == self.preposition.x or pos.z == self.preposition.z then + _aux.change_dir(self) + elseif forward_node.name == "air" + and minetest.get_item_group(inetest.get_node(forward_under_pos).name, "wet") > 0 + and has_seed_item(self) then + self.state = state.plant + self.object:set_animation(maidroid.animations.mine, 15, 0) + self.object:setvelocity{x = 0, y = 0, z = 0} + end + elseif self.state == state.punch then + if self.time_count >= max_punch_time then + if maidroid.util.table_find_value(target_plants_list, forward_node.name) then + local inv = minetest.get_inventory{type = "detached", name = self.invname} + local stacks = minetest.get_node_drops(forward_node.name) + for _, stack in ipairs(stacks) do + local leftover = inv:add_item("main", stack) + minetest.add_item(forward_pos, leftover) + end + end + self.state = state.walk + self.object:set_animation(maidroid.animations.walk, 15, 0) + self.time_count = 0 + _aux.change_dir(self) + else + self.time_count = self.time_count + 1 + end + elseif self.state == state.plant then + if self.time_count >= max_plant_time then + if forward_node.name == "air" and minetest.get_item_group( + minetest.get_node(forward_under_pos).name, "soil") > 0 then + local inv = minetest.get_inventory{type = "detached", name = self.invname} + local stacks = inv:get_list("main") + for idx, stack in ipairs(stacks) do + local item_name = stack:get_name() + if minetest.get_item_group(item_name, "seed") > 0 then + minetest.add_node(forward_pos, {name = item_name, param2 = 1}) + stack:take_item(1) + inv:set_stack("main", idx, stack) + break + end + end + end + self.state = state.walk + self.object:set_animation(maidroid.animations.walk, 15, 0) + self.time_count = 0 + _aux.change_dir(self) + else + self.time_count = self.time_count + 1 + end + end + self.preposition = pos + return + end +}) diff --git a/modules/lumberjack_module.lua b/modules/lumberjack_module.lua new file mode 100644 index 0000000..5ddf0cc --- /dev/null +++ b/modules/lumberjack_module.lua @@ -0,0 +1,132 @@ +------------------------------------------------------------ +-- Copyright (c) 2016 tacigar +-- https://github.com/tacigar/maidroid +------------------------------------------------------------ + +local util = maidroid.util +local _aux = maidroid.modules._aux + +local state = {walk = 0, plant = 1, punch = 2} +local max_punch_time = 20 +local max_plant_time = 20 +local target_tree_list = { "default:tree" } +local target_sapling_list = { "default:sapling" } + +-- punchを始める必要があるか否かを調べる +local function check_punch_flag(forward_pos) + local forward_upper_pos = util.table_shallow_copy(forward_pos) + while true do + local forward_upper_node = minetest.get_node(forward_upper_pos) + if util.table_find_value(target_tree_list, forward_upper_node.name) then + return true, forward_upper_pos, forward_upper_node + elseif forward_upper_node.name ~= "air" then break end + forward_upper_pos.y = forward_upper_pos.y + 1 + end + return false, nil, nil +end + +-- 苗木を持っているかを調べる +local function has_sapling_item(self) + local inv = maidroid._aux.get_maidroid_inventory(self) + local stacks = inv:get_list("main") + for _, stack in ipairs(stacks) do + local item_name = stack:get_name() + if util.table_find_value(target_sapling_list, item_name) then + return true + end + end + return false +end + +-- 木こりモジュールを登録する +maidroid.register_module("maidroid:lumberjack", { + description = "Maidroid Module : Lumberjack", + inventory_image = "maidroid_lumberjack_module.png", + initialize = function(self) + self.state = state.walk + self.time_count = 0 + self.object:setacceleration{x = 0, y = -10, z = 0} + self.object:set_animation(maidroid.animations.walk, 15, 0) + self.preposition = self.object:getpos() + _aux.change_dir(self) + end, + finalize = function(self) + self.state = nil + self.time_count = nil + self.preposition = nil + self.object:setvelocity{x = 0, y = 0, z = 0} + end, + on_step = function(self, dtime) + local pos = self.object:getpos() + local rpos = vector.round(pos) + local yaw = self.object:getyaw() + local forward = _aux.get_forward(yaw) + local rforward = _aux.get_round_forward(forward) + local forward_pos = vector.add(rpos, rforward) + local forward_node = minetest.get_node(forward_pos) + local forward_under_pos = _aux.get_under_pos(forward_pos) + local forward_under_node = minetest.get_node(forward_under_pos) + if self.state == state.walk then + if check_punch_flag(forward_pos) then -- punch tree node + self.state = state.punch + self.object:set_animation(maidroid.animations.mine, 15, 0) + self.object:setvelocity{x = 0, y = 0, z = 0} + elseif pos.x == self.preposition.x or pos.z == self.preposition.z then + _aux.change_dir(self) + elseif forward_node.name == "air" + and minetest.get_item_group(forward_under_node.name, "soil") > 0 + and has_sapling_item(self) then + self.state = state.plant + self.object:set_animation(maidroid.animations.mine, 15, 0) + self.object:setvelocity{x = 0, y = 0, z = 0} + end + elseif self.state == state.punch then + if self.time_count >= max_punch_time then + local punch_flag, forward_upper_pos, forward_upper_node + = check_punch_flag(forward_pos) + if punch_flag then + minetest.remove_node(forward_upper_pos) + local inv = minetest.get_inventory{type = "detached", name = self.invname} + local stacks = minetest.get_node_drops(forward_upper_node.name) + for _, stack in ipairs(stacks) do + local leftover = inv:add_item("main", stack) + minetest.add_item(forward_pos, leftover) + end + end + if (not forward_upper_pos) or (forward_upper_pos and + not check_punch_flag(_aux.get_upper_pos(forward_upper_pos))) then + self.state = state.walk + self.object:set_animation(maidroid.animations.walk, 15, 0) + _aux.change_dir(self) + end + self.time_count = 0 + else + self.time_count = self.time_count + 1 + end + elseif self.state == state.plant then + if self.time_count > max_plant_time then + if forward_node.name == "air" + and minetest.get_item_group(forward_under_node.name, "soil") > 0 then + local inv = minetest.get_inventory{type = "detached", name = self.invname} + local stacks = inv:get_list("main") + for i, stack in ipairs(stacks) do + local itemname = stack:get_name() + if util.table_find_value(target_sapling_list, itemname) then + minetest.add_node(forward_pos, {name = itemname, param2 = 1}) + stack:take_item(1) + inv:set_stack("main", i, stack) + break + end + end + end + self.state = state.walk + self.object:set_animation(maidroid.animations.walk, 15, 0) + self.time_count = 0 + _aux.change_dir(self) + else + self.time_count = self.time_count + 1 + end + end + self.preposition = pos + end +}) diff --git a/textures/normal_maidroid.png b/textures/normal_maidroid.png new file mode 100755 index 0000000000000000000000000000000000000000..c9a3203854c54f3f6a55231e4252dce699cc05c8 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqY)RhkEZpU$C&2 zSh{Fwx}n&DWWn8~tr7=PzisGidZO*5vVPa@|4Xf#-1l?HZQb)yzAyjVbcTY1i~V;j zaONxtT_Umb^15j{{|Xq+YkKh+ TdVlpK?a2uhWEA%4KoAxiwkb8{4({Yp9@QN z?mfnPv(_t|k|;L1{?Ytu@|F853uQh}{>is!{h2d8W~y7xt@ZaxNUL}+=yZc|is3Sq z8)bRHO>e7DY+A#f!;>OmVD9S~#9(-=rstMbcn_X6v|iSr>y*_`=nxSed@Nw5+1)# Q8iT^X)78&qol`;+05W@zrT_o{ literal 0 HcmV?d00001 diff --git a/util.lua b/util.lua new file mode 100644 index 0000000..b51403e --- /dev/null +++ b/util.lua @@ -0,0 +1,23 @@ +------------------------------------------------------------ +-- Copyright (c) 2016 tacigar +-- https://github.com/tacigar/maidroid +------------------------------------------------------------ + +maidroid.util = {} + +-- ある値を持つキーが存在するかを調べる +function maidroid.util.table_find_value(tbl, value) + for k, v in ipairs(tbl) do + if v == value then return true, k end + end + return false, nil +end + +-- テーブルの浅いコピー +function maidroid.util.table_shallow_copy(source) + local copy = {} + for key, value in pairs(source) do + copy[key] = value + end + return copy +end