Compare commits

...

2 Commits

View File

@ -50,6 +50,18 @@ local entity = {
sound_pitch = nil, sound_pitch = nil,
sound_propability = nil, sound_propability = nil,
-- player detection variables
player = nil,
player_pos = nil,
mini_crewmate_pos = nil,
crewmate_player_vector = nil,
distance = nil,
current_distance = nil,
current_crewmate_player_vector = nil,
mode = 0, -- | 0 - stand still | 1 - walk | 2 - chase | 3 - run away | 4 - rest mode | mode = 0, -- | 0 - stand still | 1 - walk | 2 - chase | 3 - run away | 4 - rest mode |
@ -93,46 +105,65 @@ local entity = {
}) })
end end
--local player_count = #minetest.get_connected_players() -- if on singpleplayer mode or only one player is connected, calculate distance between player and mini crewmate
--if player_count == 1 then if minetest.is_singleplayer() or #minetest.get_connected_players() == 1 then
-- game is in singleplayer mode or there is only one player minetest.chat_send_all("singleplayer or multiplayer with only one player")
-- calculate distance between "singleplayer" player and mini crewmate -- get first player
local player = minetest.get_player_by_name("singleplayer") self.player = minetest.get_connected_players()[1]
local player_pos = player:get_pos()
local mini_crewmate_pos = self.object:get_pos() self.player_pos = self.player:get_pos()
local crewmate_player_vector = vector.subtract(player_pos, mini_crewmate_pos) self.mini_crewmate_pos = self.object:get_pos()
--local distance = vector.distance(player_pos, mini_crewmate_pos) self.crewmate_player_vector = vector.subtract(self.player_pos, self.mini_crewmate_pos)
local distance = vector.length(crewmate_player_vector) self.distance = vector.length(self.crewmate_player_vector)
-- if on multiplayer mode, calculate distance between nearest player and mini crewmate
else
minetest.chat_send_all("multiplayer")
self.player = minetest.get_connected_players()
--minetest.chat_send_player("singleplayer", "HSUSS") self.distance = nil
--else self.crewmate_player_vector = nil
-- game is in multiplayer mode with more than one player
-- I will write it later. self.mini_crewmate_pos = self.object:get_pos()
--end
-- iterate over all players
for i = 1, #self.player do
minetest.chat_send_all("player " .. i)
self.player_pos = self.player[i]:get_pos()
--self.crewmate_player_vector = vector.subtract(self.player_pos, self.mini_crewmate_pos)
self.current_crewmate_player_vector = vector.subtract(self.player_pos, self.mini_crewmate_pos)
self.current_distance = vector.length(self.current_crewmate_player_vector)
-- if distance is nil or current_distance is smaller than distance, set distance to current_distance
if self.distance == nil or self.current_distance < self.distance then
self.distance = self.current_distance
self.crewmate_player_vector = self.current_crewmate_player_vector
end
end
end
-- if mode is 0 or 1 (stand still or walk) and distance is smaller or equal to largest_distance_to_find_player, set mode to 2 (chase) -- if mode is 0 or 1 (stand still or walk) and distance is smaller or equal to largest_distance_to_find_player, set mode to 2 (chase)
if (self.mode == 0 or self.mode == 1) and distance <= self.largest_distance_to_find_player then if (self.mode == 0 or self.mode == 1) and self.distance <= self.largest_distance_to_find_player then
self.mode = 2 self.mode = 2
-- elseif mode is 2 (chase) -- elseif mode is 2 (chase)
elseif self.mode == 2 then elseif self.mode == 2 then
-- if distance is greater or equal to smallest_distance_to_lost_player, set mode to 0 (stand still) -- if distance is greater or equal to smallest_distance_to_lost_player, set mode to 0 (stand still)
if distance >= self.smallest_distance_to_lost_player then if self.distance >= self.smallest_distance_to_lost_player then
self.mode = 0 self.mode = 0
-- elif distance is smaller or equal to largest_distance_to_stand_still, set mode to 4 (rest mode) -- elif distance is smaller or equal to largest_distance_to_stand_still, set mode to 4 (rest mode)
elseif distance <= self.largest_distance_to_stand_still then elseif self.distance <= self.largest_distance_to_stand_still then
self.mode = 4 self.mode = 4
end end
-- if mode is 4 (rest mode) and distance is greater than largest_distance_to_stand_still, set mode to 2 (chase) -- if mode is 4 (rest mode) and distance is greater than largest_distance_to_stand_still, set mode to 2 (chase)
elseif self.mode == 4 and distance > self.largest_distance_to_stand_still then elseif self.mode == 4 and self.distance > self.largest_distance_to_stand_still then
self.mode = 2 self.mode = 2
-- running away mode -- running away mode
elseif self.mode == 3 then elseif self.mode == 3 then
-- if distance is greater than smallest_distance_to_lost_player, set mode to 0 (stand still) -- if distance is greater than smallest_distance_to_lost_player, set mode to 0 (stand still)
if distance > self.smallest_distance_to_stop_run_away then if self.distance > self.smallest_distance_to_stop_run_away then
self.mode = 1 self.mode = 1
else else
-- jump if on ground -- jump if on ground
@ -189,10 +220,10 @@ local entity = {
-- if mode is 3 (run away) set rotation so mini crewmate is facing either at the player or away from the player depending on situation -- if mode is 3 (run away) set rotation so mini crewmate is facing either at the player or away from the player depending on situation
if self.mode == 3 then if self.mode == 3 then
-- look away from the player -- look away from the player
self.object:set_yaw(math.atan2(-crewmate_player_vector.z, -crewmate_player_vector.x)) self.object:set_yaw(math.atan2(-self.crewmate_player_vector.z, -self.crewmate_player_vector.x))
else else
-- look at the player -- look at the player
self.object:set_yaw(math.atan2(crewmate_player_vector.z, crewmate_player_vector.x)) self.object:set_yaw(math.atan2(self.crewmate_player_vector.z, self.crewmate_player_vector.x))
end end
end end