Compare commits
2 Commits
688f73e4a3
...
97601cfe24
Author | SHA1 | Date | |
---|---|---|---|
97601cfe24 | |||
673e7083a7 |
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user