aboutsummaryrefslogtreecommitdiff
path: root/src/mapchunk.h
blob: a70de8711bbe98ea73e0262967455f3a53c4f8af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
Minetest
Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#ifndef MAPCHUNK_HEADER
#define MAPCHUNK_HEADER

/*
	TODO: Remove
*/

#if 0
/*
	MapChunk contains map-generation-time metadata for an area of
	some MapSectors. (something like 16x16)
*/

// These should fit in 8 bits, as they are saved as such.
enum{
	GENERATED_FULLY = 0,
	GENERATED_PARTLY = 10,
	GENERATED_NOT = 20
};

class MapChunk
{
public:
	MapChunk():
		m_generation_level(GENERATED_NOT),
		m_modified(true)
	{
	}

	/*
		Generation level. Possible values:
		GENERATED_FULLY = 0 = fully generated
		GENERATED_PARTLY = partly generated
		GENERATED_NOT = not generated
	*/
	u16 getGenLevel(){ return m_generation_level; }
	void setGenLevel(u16 lev){ m_generation_level = lev; }

	void serialize(std::ostream &os, u8 version)
	{
		os.write((char*)&m_generation_level, 1);
	}
	void deSerialize(std::istream &is, u8 version)
	{
		is.read((char*)&m_generation_level, 1);
	}

	bool isModified(){ return m_modified; }
	void setModified(bool modified){ m_modified = modified; }

private:
	u8 m_generation_level;
	bool m_modified;
};
#endif

#endif

peed of a train is determined by the wagon with the lowest max_speed value. seats = { ^- contains zero or more seat definitions. A seat is a place where a player can be attached when getting on a wagon. { name="Left front window", ^- display name of this seat attach_offset={x=0, y=10, z=0}, ^- this value is passed to 'set_attach' view_offset={x=0, y=6, z=0}, ^- player:set_eye_offset is called with this parameter. group="default" ^- optional. Defines the seat group. See 'seat_groups' below -!- Note: driving_ctrl_access field has moved to seat group definition, -!- but is still partwise supported here. If you don't use seat groups yet, -!- you really should change NOW! }, }, seat_groups = { ^- If defined, activates advanced seating behavior. See "seating behavior". default = { name = "Seats" ^- name of this seat group, to be shown in get-on menu. access_to = {"foo", "bar"} ^- List of seat groups you can access from this seat using the menu when sitting inside the train. require_doors_open = true ^- Only allow getting on and off if doors are open. driving_ctrl_access=false, ^- If the seat is a driver stand, and players sitting here should get access to the train's driving control. } } assign_to_seat_group = {"default"}, ^- optional, like seat_groups. When player right_clicks the wagon, player will be assigned to the first free seat group in the list. doors={ ^- optional. If defined, defines door animation frames. Opposite door has to be closed during animation period. ^- Remember, advtrains can't handle doors on both sides opened simultaneously. open={ [-1]={frames={x=0, y=20}, time=1}, -- open left doors [1]={frames={x=40, y=60}, time=1} -- open right doors sound = <simpleSoundSpec> ^- The sound file of the doors opening. If none is specified, nothing is played. }, close={ [-1]={frames={x=20, y=40}, time=1}, -- close left doors [1]={frames={x=60, y=80}, time=1} -- close right doors sound = <simpleSoundSpec> ^- The sound file of the doors closing. If none is specified, nothing is played. } }, door_entry={ 1.5, -1.5 } ^- optional. If defined, defines the locations of the doors on the model as distance from the object center on the path. ^- Getting on by walking in then takes effect. ^- Positive values mean front, negative ones back. Resulting position is automatically shifted to the right side. wagon_span=2, ^- How far this wagon extends from its base position. Is the half of the wagon length. ^- Used to determine in which distance the other wagons have to be positioned. Will require tweaking. extent_h = 1, ^- Determines the collision box extent in x/z direction. Defaults to 1 (=3x3) ^- The actual bounding box size is (extent_h*2)+1, so 0 means 1x1, 1 means 3x3 and 2 means 5x5 extent_v = 2, ^- Determines the collision box extent in y direction. Defaults to 2 (=3). ^- The actual bounding box size is extent_v+1, so 0 means 1, 1 means 2, 2 means 3 a.s.o. horn_sound = <simpleSoundSpec>, ^- The sound file of the horn. If none is specified, this wagon can't sound a horn. The specified sound file will be looped. drops = {"default:steelblock 3"} ^- List of itemstrings what to drop when the wagon is destroyed has_inventory = false ^- If this wagon has an inventory. The inventory is saved with the wagon. ^- the following settings are ignored if not. inventory_list_sizes = { box=8*6, }, ^- List of assignments of type list_name=size. ^- For every entry, an inventory list is created with the specified size. get_inventory_formspec = function(self, player_name, inventory_name) return "<a formspec>" end, ^- Function that should return the formspec to be displayed when <player> requests to open the wagon's inventory. ^- advtrains.standard_inventory_formspec can be used for ordinary wagons with inventories to show ^- both the inventory grid and a 'Wagon properties' button. ^- Use "list["..inventory_name..";<list_name>;<X>,<Y>;<W>,<H>;<Start>]" to display a wagon's inventory list. custom_on_step = function(self, dtime) end ^- optional: Execute custom code on every step custom_on_activate = function(self, dtime_s) end ^- optional: Execute custom code on activate. Staticdata does not need to be saved and restored since all properties written in 'self' are preserved over unloads. custom_on_velocity_change = function(self, velocity, old_velocity) end ^- optional: Function that is called whenever the train's velocity changes or every 2 seconds. Used to call 'self.object:update_animation()' if needed. ^- for compatibility reasons the name 'update_animation' for this function is still supported. } # Notes on wagons - Every wagon has the field 'id' which assigns each wagon a random id. - Properties written in the Lua Entity (self) are discarded when the wagon entity is unloaded. At the moment there is no way to store data inside a wagon persistently. - Assuming Z Axis as the axis parallel to the tracks and Y Axis as the one pointing into the sky, wagon models should be dimensioned in a way that: - their origin is centered in X and Z direction - their origin lies 0.5 units above the bottom of the model - the overall extent in X and Y direction is <=3 units - wagon_span is then the distance between the model origin and the Z axis extent. # Seating behavior If the advanced seating behavior is active, clicking on a wagon will immediately get you on that wagon depending on the entries in assign_to_seat_group. If all seat groups are full, if the doors are closed or if you are not authorized to enter this seat group(e.g. driver stands), will show a warning. On a train, right-clicking the wagon will make you get off the train unless: - the doors are closed and it requires open doors. - you have access to a seat group specified in access_to (you may enter it and it's not full) - you are the owner and can access the wagon preferences In case there's no possibility, does nothing. In case there are multiple possibilities, will show a form. If you can't enter or leave a train because the doors are closed, holding the Sneak key while right-clicking bypasses the "doors have to be open" enforcement. ### Tracks Most modders will be satisfied with the built-in tracks. If cog railways, maglev trains and mine trains are added, it is necessary to understand the definition of tracks. Although the tracks API is there, explaining it would require more effort than me creating the wanted definitions myself. Contact me if you need to register your own rails using my registration functions. However, it is still possible to register single rails by understanding the node properties of rails. minetest.register_node(nodename, { ... usual node definition ... groups = { advtrains_track = 1, advtrains_track_<tracktype>=1 ^- these groups tell that the node is a track not_blocking_trains=1, ^- this group tells that the node should not block trains although it's walkable. }, at_rail_y = 0, ^- Height of this rail node (the y position of a wagon that stands centered on this rail) at_conns = { [1] = { c=0..15, y=0..1 }, [2] = { c=0..15, y=0..1 }, ( [3] = { c=0..15, y=0..1 }, ) ( [4] = { c=0..15, y=0..1 }, ) } ^- Connections of this rail. There can be up to 4 connections. 2 connections are a normal rail, 3 connections a turnout (1->2 and 2/3->1) and 4 connections a crossing (1<>2 and 3<>4) c is the direction of the connection (0-16) and y is the height of the connection (rail will only connect when this matches) can_dig=function(pos) return not advtrains.get_train_at_pos(pos) end, after_dig_node=function(pos) advtrains.ndb.update(pos) end, after_place_node=function(pos) advtrains.ndb.update(pos) end, ^- the code in these 3 default minetest API functions is required for advtrains to work, however you can add your own code advtrains = { on_train_enter=function(pos, train_id, train, index) end ^- called when a train enters the rail on_train_leave=function(pos, train_id, train, index) end ^- called when a train leaves the rail -- The following function is only in effect when interlocking is enabled: on_train_approach = function(pos, train_id, train, index, lzbdata) ^- called when a train is approaching this position, called exactly once for every path recalculation (which can happen at any time) ^- This is called so that if the train would start braking now, it would come to halt about(wide approx) 5 nodes before the rail. ^- lzbdata should be ignored and nothing should be assigned to it } })