mirror of
				https://github.com/SmallJoker/boost_cart.git
				synced 2025-10-31 05:15:23 +01:00 
			
		
		
		
	Compare commits
	
		
			9 Commits
		
	
	
		
			rotationte
			...
			e4edb96d30
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | e4edb96d30 | ||
|  | 3386942d71 | ||
|  | d486143f42 | ||
|  | 34155473a9 | ||
|  | 7e275e1985 | ||
|  | c6b9e4b672 | ||
|  | 3781f6d4c0 | ||
|  | f4c1a2ec3b | ||
|  | 57d09fac79 | 
| @@ -19,12 +19,14 @@ function boost_cart:on_rail_step(entity, pos, distance) | ||||
| end | ||||
|  | ||||
| local cart_entity = { | ||||
| 	physical = false, | ||||
| 	collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, | ||||
| 	visual = "mesh", | ||||
| 	mesh = "cart.x", | ||||
| 	visual_size = {x=1, y=1}, | ||||
| 	textures = {"cart.png"}, | ||||
| 	initial_properties = { | ||||
| 		physical = false, | ||||
| 		collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, | ||||
| 		visual = "mesh", | ||||
| 		mesh = "cart.x", | ||||
| 		visual_size = {x=1, y=1}, | ||||
| 		textures = {"cart.png"}, | ||||
| 	}, | ||||
|  | ||||
| 	driver = nil, | ||||
| 	punched = false, -- used to re-send velocity and position | ||||
| @@ -34,15 +36,13 @@ local cart_entity = { | ||||
| 	old_switch = 0, | ||||
| 	sound_counter = 0, | ||||
| 	railtype = nil, | ||||
| 	attached_items = {}, | ||||
| 	automatic_face_movement_dir = -90.0, | ||||
| 	automatic_face_movement_max_rotation_per_sec = 360 * 4, | ||||
| 	attached_items = {} | ||||
| } | ||||
|  | ||||
| -- Model and textures | ||||
| if boost_cart.mtg_compat then | ||||
| 	cart_entity.mesh = "carts_cart.b3d" | ||||
| 	cart_entity.textures = {"carts_cart.png"} | ||||
| 	cart_entity.initial_properties.mesh = "carts_cart.b3d" | ||||
| 	cart_entity.initial_properties.textures = {"carts_cart.png"} | ||||
| end | ||||
|  | ||||
| function cart_entity:on_rightclick(clicker) | ||||
| @@ -56,6 +56,12 @@ function cart_entity:on_rightclick(clicker) | ||||
| 	elseif not self.driver then | ||||
| 		self.driver = player_name | ||||
| 		boost_cart:manage_attachment(clicker, self.object) | ||||
|  | ||||
| 		if default.player_set_animation then | ||||
| 			-- player_api(/default) does not update the animation | ||||
| 			-- when the player is attached, reset to default animation | ||||
| 			default.player_set_animation(clicker, "stand") | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| @@ -71,18 +77,29 @@ function cart_entity:on_activate(staticdata, dtime_s) | ||||
| 		return | ||||
| 	end | ||||
| 	self.railtype = data.railtype | ||||
| 	if data.old_dir then | ||||
| 		self.old_dir = data.old_dir | ||||
| 	self.old_dir = data.old_dir or self.old_dir | ||||
| 	self.old_pos = data.old_pos or self.old_pos | ||||
| 	-- Correct the position when the cart drives further after the last 'step()' | ||||
| 	if self.old_pos and boost_cart:is_rail(self.old_pos, self.railtype) then | ||||
| 		self.object:set_pos(self.old_pos) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| function cart_entity:get_staticdata() | ||||
| 	return minetest.serialize({ | ||||
| 		railtype = self.railtype, | ||||
| 		old_dir = self.old_dir | ||||
| 		old_dir = self.old_dir, | ||||
| 		old_pos = self.old_pos | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| -- 0.5.x and later: When the driver leaves | ||||
| function cart_entity:on_detach_child(child) | ||||
| 	if child and child:get_player_name() == self.driver then | ||||
| 		self.driver = nil | ||||
| 	end | ||||
| end | ||||
|  | ||||
| function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) | ||||
| 	local pos = self.object:get_pos() | ||||
| 	local vel = self.object:get_velocity() | ||||
| @@ -218,11 +235,12 @@ function cart_entity:on_step(dtime) | ||||
| 	) | ||||
| 	local dir_changed = not vector.equals(dir, self.old_dir) | ||||
|  | ||||
| 	local new_acc = {x=0, y=0, z=0} | ||||
| 	local acc = 0 | ||||
| 	if stop_wiggle or vector.equals(dir, {x=0, y=0, z=0}) then | ||||
| 		vel = {x=0, y=0, z=0} | ||||
| 		local pos_r = vector.round(pos) | ||||
| 		if not boost_cart:is_rail(pos_r, self.railtype) then | ||||
| 		if not boost_cart:is_rail(pos_r, self.railtype) | ||||
| 				and self.old_pos then | ||||
| 			pos = self.old_pos | ||||
| 		elseif not stop_wiggle then | ||||
| 			pos = pos_r | ||||
| @@ -234,7 +252,7 @@ function cart_entity:on_step(dtime) | ||||
| 	else | ||||
| 		-- Direction change detected | ||||
| 		if dir_changed then | ||||
| 			vel = vector.multiply(dir, v3_len(vel)) | ||||
| 			vel = vector.multiply(dir, math.abs(vel.x + vel.z)) | ||||
| 			update.vel = true | ||||
| 			if dir.y ~= self.old_dir.y then | ||||
| 				pos = vector.round(pos) | ||||
| @@ -252,7 +270,7 @@ function cart_entity:on_step(dtime) | ||||
| 		end | ||||
|  | ||||
| 		-- Calculate current cart acceleration | ||||
| 		local acc = nil | ||||
| 		acc = nil | ||||
|  | ||||
| 		local acc_meta = minetest.get_meta(pos):get_string("cart_acceleration") | ||||
| 		if acc_meta == "halt" and not self.punched then | ||||
| @@ -294,21 +312,20 @@ function cart_entity:on_step(dtime) | ||||
| 		else | ||||
| 			acc = 0 | ||||
| 		end | ||||
|  | ||||
| 		new_acc = vector.multiply(dir, acc) | ||||
| 	end | ||||
|  | ||||
| 	-- Limits | ||||
| 	local max_vel = boost_cart.speed_max | ||||
| 	for _,v in pairs({"x","y","z"}) do | ||||
| 		if math.abs(vel[v]) > max_vel then | ||||
| 			vel[v] = boost_cart:get_sign(vel[v]) * max_vel | ||||
| 			new_acc[v] = 0 | ||||
| 			update.vel = true | ||||
| 		end | ||||
| 	-- Limit cart speed | ||||
| 	local vel_len = vector.length(vel) | ||||
| 	if vel_len > boost_cart.speed_max then | ||||
| 		vel = vector.multiply(vel, boost_cart.speed_max / vel_len) | ||||
| 		update.vel = true | ||||
| 	end | ||||
| 	if vel_len >= boost_cart.speed_max and acc > 0 then | ||||
| 		acc = 0 | ||||
| 	end | ||||
|  | ||||
| 	self.object:set_acceleration(new_acc) | ||||
| 	self.object:set_acceleration(vector.multiply(dir, acc)) | ||||
|  | ||||
| 	self.old_pos = vector.round(pos) | ||||
| 	local old_y_dir = self.old_dir.y | ||||
| 	if not vector.equals(dir, {x=0, y=0, z=0}) and not stop_wiggle then | ||||
| @@ -343,17 +360,15 @@ function cart_entity:on_step(dtime) | ||||
| 	-- Re-use "dir", localize self.old_dir | ||||
| 	dir = self.old_dir | ||||
|  | ||||
| 	if stop_wiggle then | ||||
| 		local yaw = 0 | ||||
| 		if dir.x < 0 then | ||||
| 			yaw = 0.5 | ||||
| 		elseif dir.x > 0 then | ||||
| 			yaw = 1.5 | ||||
| 		elseif dir.z < 0 then | ||||
| 			yaw = 1 | ||||
| 		end | ||||
| 		self.object:set_yaw(yaw * math.pi) | ||||
| 	local yaw = 0 | ||||
| 	if dir.x < 0 then | ||||
| 		yaw = 0.5 | ||||
| 	elseif dir.x > 0 then | ||||
| 		yaw = 1.5 | ||||
| 	elseif dir.z < 0 then | ||||
| 		yaw = 1 | ||||
| 	end | ||||
| 	self.object:set_yaw(yaw * math.pi) | ||||
|  | ||||
| 	local anim = {x=0, y=0} | ||||
| 	if dir.y == -1 then | ||||
|   | ||||
							
								
								
									
										71
									
								
								doc/mod_api.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								doc/mod_api.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| boost_cart API | ||||
| ============== | ||||
|  | ||||
| This file provides information about the API of boost_cart for the use in | ||||
| mods. The API might change slightly when the development goes on, so avoid | ||||
| using internal tables or functions which are not documented here. | ||||
|  | ||||
|  | ||||
| Types | ||||
| ----- | ||||
|  | ||||
| * `SwitchIgnore` -> `number/nil` | ||||
| 	* Specifies which player control was pressed. This value is used to prefer | ||||
| 	  straight rails instead of preferring left and right rail checks. | ||||
| 		* `1`: Ignore left rail | ||||
| 		* `2`: Ignore right rail | ||||
| 		* `nil`: Ignore no rail | ||||
|  | ||||
|  | ||||
| Entity movement | ||||
| --------------- | ||||
| These functions are grouped so that they make sense and then sorted alphabetically. | ||||
|  | ||||
| * `boost_cart:manage_attachment(player, obj)` | ||||
| 	* Attaches or detaches the player to/from an object, depending on what is | ||||
| 	  supplied to `obj`. | ||||
| 	* `player`: `ObjectRef` of the player | ||||
| 	* `obj`: `ObjectRef` (to attach) or `nil` (to detach) | ||||
| * `boost_cart:get_sign(n)` -> `number` | ||||
| 	* Returns the sign for the given number. Values: `-1`, `0`, `1` | ||||
| 	* `n`: any `number` | ||||
| * `boost_cart:velocity_to_dir(vel)` -> `vector` | ||||
| 	* Returns the cart direction depending on `vel`. Each coordinate can have | ||||
| 	  one of the `get_sign()` return values. | ||||
| 	* `vel`: velocity as `vector` | ||||
| * `boost_cart:boost_rail(pos, amount)` | ||||
| 	* Sets the rail acceleration for the given position to `amount` and punches | ||||
| 	  carts which are at the given position. | ||||
| 	* `pos`: `vector`, rail position | ||||
| 	* `amount`: `number`, negative to brake, positive to boost | ||||
| * `boost_cart:get_rail_direction(pos, dir, ctrl, old_switch, railtype)` | ||||
| 	-> `vector, SwitchIgnore` | ||||
| 	* Returns the direction to where the next rail is, and which player control that | ||||
| 	  should be ignored in the next call. | ||||
| 	* `pos`: `vector`, position of the cart | ||||
| 	* `dir`: `vector`, movement direction of the cart (see `velocity_to_dir()`) | ||||
| 	* `ctrl`: Player controls table or `nil` (no player) | ||||
| 	* `old_switch`: `SwitchIgnore` | ||||
| 	* `railtype`: (optional) `number`, gets passed indirectly to `is_rail()` | ||||
|  | ||||
|  | ||||
| Rail helper functions | ||||
| --------------------- | ||||
| * `boost_cart:get_rail_groups(groups)` -> `table` | ||||
| 	* Returns a group table with preset values for a common rail node | ||||
| 	* `groups`: (optional) `table`, additional groups append (or overwrite) | ||||
| 	* Hint: To register an incompatible rail type, set the group | ||||
| 	  `connect_to_raillike` to the value returned by | ||||
| 	  `minetest.raillike_group(new_rail_type)` | ||||
| * `boost_cart:is_rail(pos, [railtype])` -> `boolean` | ||||
| 	* Returns whether the node at `pos` is a rail. When `railtype` is specified, | ||||
| 	  `true` is only returned when the node is in the same rail group. | ||||
| 	* `pos`: `vector` of the node to check | ||||
| 	* `railtype`: (optional) `number`, rail group number | ||||
| * `boost_cart:register_rail(name, def)` | ||||
| 	* Registers a new rail with preset node definition defaults as fallback | ||||
| 	* `name`: `string`, node name of the new rail | ||||
| 	* `def`: Node definition table, containing at least the following keys: | ||||
| 		* `description` | ||||
| 		* `groups` | ||||
| 		* `tiles` | ||||
| @@ -19,6 +19,9 @@ function boost_cart:manage_attachment(player, obj) | ||||
|  | ||||
| 	if status then | ||||
| 		local y_pos = self.old_player_model and 6 or -4 | ||||
| 		if player:get_properties().visual == "upright_sprite" then | ||||
| 			y_pos = -4 | ||||
| 		end | ||||
| 		player:set_attach(obj, "", {x=0, y=y_pos, z=0}, {x=0, y=0, z=0}) | ||||
| 		player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0}) | ||||
| 	else | ||||
| @@ -104,6 +107,16 @@ function boost_cart:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) | ||||
| 		right.z = -dir.x | ||||
| 	end | ||||
|  | ||||
| 	local straight_priority = ctrl and dir.y ~= 0 | ||||
|  | ||||
| 	-- Normal, to disallow rail switching up- & downhill | ||||
| 	if straight_priority then | ||||
| 		cur = self:check_front_up_down(pos, dir, true, railtype) | ||||
| 		if cur then | ||||
| 			return cur | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	if ctrl then | ||||
| 		if old_switch == 1 then | ||||
| 			left_check = false | ||||
| @@ -127,9 +140,11 @@ function boost_cart:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) | ||||
| 	end | ||||
|  | ||||
| 	-- Normal | ||||
| 	cur = self:check_front_up_down(pos, dir, true, railtype) | ||||
| 	if cur then | ||||
| 		return cur | ||||
| 	if not straight_priority then | ||||
| 		cur = self:check_front_up_down(pos, dir, true, railtype) | ||||
| 		if cur then | ||||
| 			return cur | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	-- Left, if not already checked | ||||
| @@ -208,6 +223,9 @@ function boost_cart:boost_rail(pos, amount) | ||||
| end | ||||
|  | ||||
| function boost_cart:register_rail(name, def_overwrite) | ||||
| 	local sound_func = default.node_sound_metal_defaults | ||||
| 		or default.node_sound_defaults | ||||
|  | ||||
| 	local def = { | ||||
| 		drawtype = "raillike", | ||||
| 		paramtype = "light", | ||||
| @@ -217,7 +235,8 @@ function boost_cart:register_rail(name, def_overwrite) | ||||
| 		selection_box = { | ||||
| 			type = "fixed", | ||||
| 			fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, | ||||
| 		} | ||||
| 		}, | ||||
| 		sounds = sound_func() | ||||
| 	} | ||||
| 	for k, v in pairs(def_overwrite) do | ||||
| 		def[k] = v | ||||
|   | ||||
							
								
								
									
										4
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								init.lua
									
									
									
									
									
								
							| @@ -25,8 +25,8 @@ if not default.player_attached then | ||||
| 	default.player_attached = {} | ||||
| end | ||||
|  | ||||
| minetest.after(1, function() | ||||
| 	boost_cart.old_player_model = type(player_api) ~= "table" | ||||
| minetest.after(0, function() | ||||
| 	boost_cart.old_player_model = not minetest.global_exists("player_api") | ||||
| end) | ||||
|  | ||||
| dofile(boost_cart.modpath.."/functions.lua") | ||||
|   | ||||
| @@ -18,6 +18,15 @@ boost_cart:register_rail(":"..regular_rail_itemname, { | ||||
| -- Moreores' copper rail | ||||
| if minetest.get_modpath("moreores") then | ||||
| 	minetest.register_alias("carts:copperrail", "moreores:copper_rail") | ||||
|  | ||||
| 	if minetest.raillike_group then | ||||
| 		-- Ensure that this rail uses the same connect_to_raillike | ||||
| 		local new_groups = minetest.registered_nodes["moreores:copper_rail"].groups | ||||
| 		new_groups.connect_to_raillike = minetest.raillike_group("rail") | ||||
| 		minetest.override_item("moreores:copper_rail", { | ||||
| 			groups = new_groups | ||||
| 		}) | ||||
| 	end | ||||
| else | ||||
| 	boost_cart:register_rail(":carts:copperrail", { | ||||
| 		description = "Copper rail", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user