Compare commits

...

5 Commits

Author SHA1 Message Date
Joachim Stolberg 8b619f8509 Fix use_texture_alpha issues 2022-07-11 20:13:42 +02:00
Joachim Stolberg 1b62b5f613 Fix server crash 2022-06-16 20:56:47 +02:00
Joachim Stolberg 0dcee15782 Change code so that a recording updates the start buffer infotext 2022-01-24 18:42:06 +01:00
Joachim Stolberg 3afac50041 Allow cart exit with jump key 2022-01-03 11:57:14 +01:00
Joachim Stolberg e587efc2b8 Fix cart placement and monitoring bugs 2021-11-20 13:28:44 +01:00
7 changed files with 55 additions and 24 deletions

View File

@ -144,7 +144,7 @@ minetest.register_entity("minecart:marker", {
initial_properties = {
visual = "upright_sprite",
textures = {"minecart_marker_cube.png"},
use_texture_alpha = true,
use_texture_alpha = minecart.CLIP,
physical = false,
glow = 12,
static_save = false,
@ -196,23 +196,27 @@ function minecart.is_owner(player, owner)
end
function minecart.get_buffer_pos(pos, player_name)
local pos1 = minecart.find_node_near_lvm(pos, 1, {"minecart:buffer"})
if pos1 then
local meta = minetest.get_meta(pos1)
if player_name == nil or player_name == meta:get_string("owner") then
return pos1
if pos then
local pos1 = minecart.find_node_near_lvm(pos, 1, {"minecart:buffer"})
if pos1 then
local meta = minetest.get_meta(pos1)
if player_name == nil or player_name == meta:get_string("owner") then
return pos1
end
end
end
end
function minecart.get_buffer_name(pos)
local pos1 = minecart.find_node_near_lvm(pos, 1, {"minecart:buffer"})
if pos1 then
local name = M(pos1):get_string("name")
if name ~= "" then
return name
if pos then
local pos1 = minecart.find_node_near_lvm(pos, 1, {"minecart:buffer"})
if pos1 then
local name = M(pos1):get_string("name")
if name ~= "" then
return name
end
return P2S(pos1)
end
return P2S(pos1)
end
end
@ -259,7 +263,9 @@ function minecart.add_nodecart(pos, node_name, param2, cargo, owner, userID)
-- If no rail is around, use an available cart as new search center
pos2 = minetest.find_node_near(pos, 1, minecart.lRailsExt)
-- ...and search again.
pos2 = minetest.find_node_near(pos2, 1, minecart.lRails)
if pos2 then
pos2 = minetest.find_node_near(pos2, 1, minecart.lRails)
end
end
else
pos2 = vector.new(pos)

View File

@ -37,7 +37,7 @@ local function remote_station_name(pos)
end
end
local function on_punch(pos, node, puncher)
function minecart.update_buffer_infotext(pos)
local name = M(pos):get_string("name")
local dest = remote_station_name(pos)
if dest then
@ -45,6 +45,10 @@ local function on_punch(pos, node, puncher)
else
M(pos):set_string("infotext", name .. ": " .. S("Not connected!"))
end
end
local function on_punch(pos, node, puncher)
minecart.update_buffer_infotext(pos)
M(pos):set_string("formspec", formspec(pos))
minetest.get_node_timer(pos):start(CYCLE_TIME)

View File

@ -217,9 +217,20 @@ local function on_step(self, dtime)
recording_waypoints(self)
self.rec_time = self.rec_time + 2.0
end
recording_junctions(self)
if recording_junctions(self) then
local pos = vector.round(self.object:get_pos())
minecart.stop_recording(self, pos, true)
local player = minetest.get_player_by_name(self.driver)
minecart.manage_attachment(player, self, false)
minecart.entity_to_node(pos, self)
end
else
player_ctrl(self)
if player_ctrl(self) then
local pos = vector.round(self.object:get_pos())
local player = minetest.get_player_by_name(self.driver)
minecart.manage_attachment(player, self, false)
minecart.entity_to_node(pos, self)
end
end
end
end
@ -241,7 +252,7 @@ local function on_entitycard_punch(self, puncher, time_from_last_punch, tool_cap
-- Dig cart
if self.driver then
-- remove cart as driver
minecart.stop_recording(self, pos)
minecart.stop_recording(self, pos, true)
minecart.monitoring_remove_cart(self.owner, self.userID)
minecart.remove_entity(self, pos, puncher)
minecart.manage_attachment(puncher, self, false)
@ -273,12 +284,13 @@ local function on_entitycard_rightclick(self, clicker)
if self.driver then
-- get off
local pos = vector.round(self.object:get_pos())
minecart.stop_recording(self, pos, true)
minecart.manage_attachment(clicker, self, false)
minecart.entity_to_node(pos, self)
else
-- get on
local pos = vector.round(self.object:get_pos())
minecart.stop_recording(self, pos)
minecart.stop_recording(self, pos, true)
minecart.manage_attachment(clicker, self, true)
end
end

View File

@ -213,7 +213,9 @@ function minecart.monitoring_remove_cart(owner, userID)
if tCartsOnRail[owner] and tCartsOnRail[owner][userID] then
-- Cart stopped?
if tCartsOnRail[owner][userID].objID == 0 then
-- Can directly be deleted
-- Mark as "to be deleted" by monitoring (if part of monitoring)
tCartsOnRail[owner][userID].objID = nil
-- And delete directly in addition
tCartsOnRail[owner][userID] = nil
else -- Cart running
-- Mark as "to be deleted" by monitoring
@ -292,7 +294,7 @@ minetest.register_chatcommand("stopcart", {
minecart.remove_entity(entity, data.pos)
else
-- Cart as zombie/invalid/corrupted
-- nothing to do
minetest.log("warning", "[Minecart] data.objID ~= 0, but no entity available!")
end
minetest.add_item(player_pos, ItemStack({name = data.node_name}))
minecart.monitoring_remove_cart(owner, userID)

View File

@ -103,12 +103,14 @@ function minecart.start_recording(self, pos)
end
end
function minecart.stop_recording(self, pos)
function minecart.stop_recording(self, pos, force_exit)
--print("stop_recording")
if self.driver and self.is_recording then
local dest_pos = minecart.get_buffer_pos(pos, self.driver)
local player = minetest.get_player_by_name(self.driver)
if dest_pos and player and #self.checkpoints > 3 then
if force_exit then
minetest.chat_send_player(self.driver, S("[minecart] Recording canceled!"))
elseif dest_pos and player and #self.checkpoints > 3 then
-- Remove last checkpoint, because it is potentially too close to the dest_pos
table.remove(self.checkpoints)
if self.start_pos then
@ -123,6 +125,7 @@ function minecart.stop_recording(self, pos)
local length = speed * self.runtime
local fmt = S("[minecart] Speed = %u m/s, Time = %u s, Route length = %u m")
minetest.chat_send_player(self.driver, string.format(fmt, speed, self.runtime, length))
minecart.update_buffer_infotext(self.start_pos)
end
elseif #self.checkpoints <= 3 then
minetest.chat_send_player(self.driver, S("[minecart] Your route is too short to record!"))
@ -163,6 +166,8 @@ function minecart.recording_junctions(self)
self.ctrl = {right = true}
elseif ctrl.up or ctrl.down then
self.ctrl = nil
elseif ctrl.jump then
return true
end
end
if self.hud_time <= self.timebase then
@ -186,6 +191,8 @@ function minecart.player_ctrl(self)
self.ctrl = {left = true}
elseif ctrl.right then
self.ctrl = {right = true}
elseif ctrl.jump then
return true
end
end
end

View File

@ -57,8 +57,8 @@ minetest.register_on_mods_loaded(function()
-- mark all entity carts as zombified
if cart.objID ~= 0 then
cart.objID = -1
minecart.push(1, cart)
end
minecart.push(1, cart)
end
end
end

View File

@ -102,7 +102,7 @@ minetest.register_node("minecart:tool", {
inventory_image = "minecart_tool.png",
wield_image = "minecart_tool.png",
liquids_pointable = true,
use_texture_alpha = true,
use_texture_alpha = minecart.CLIP,
groups = {cracky=1, book=1},
on_use = click_left,
on_place = click_right,