4
4
--
5
5
6
6
local function is_water (pos )
7
- local nn = minetest .env : get_node (pos ).name
7
+ local nn = minetest .get_node (pos ).name
8
8
return minetest .get_item_group (nn , " water" ) ~= 0
9
9
end
10
10
@@ -39,6 +39,7 @@ local boat = {
39
39
40
40
driver = nil ,
41
41
v = 0 ,
42
+ last_v = 0 ,
42
43
}
43
44
44
45
function boat :on_rightclick (clicker )
@@ -67,6 +68,7 @@ function boat:on_activate(staticdata, dtime_s)
67
68
if staticdata then
68
69
self .v = tonumber (staticdata )
69
70
end
71
+ self .last_v = self .v
70
72
end
71
73
72
74
function boat :get_staticdata ()
75
77
76
78
function boat :on_punch (puncher , time_from_last_punch , tool_capabilities , direction )
77
79
self .object :remove ()
78
- if puncher and puncher :is_player () then
80
+ if puncher and puncher :is_player () and not minetest . setting_getbool ( " creative_mode " ) then
79
81
puncher :get_inventory ():add_item (" main" , " boats:boat" )
80
82
end
81
83
end
@@ -84,6 +86,7 @@ function boat:on_step(dtime)
84
86
self .v = get_v (self .object :getvelocity ())* get_sign (self .v )
85
87
if self .driver then
86
88
local ctrl = self .driver :get_player_control ()
89
+ local yaw = self .object :getyaw ()
87
90
if ctrl .up then
88
91
self .v = self .v + 0.1
89
92
end
@@ -92,19 +95,23 @@ function boat:on_step(dtime)
92
95
end
93
96
if ctrl .left then
94
97
if ctrl .down then
95
- self .object :setyaw (self . object : getyaw () - math.pi / 120 - dtime * math.pi / 120 )
98
+ self .object :setyaw (yaw - math.pi / 120 - dtime * math.pi / 120 )
96
99
else
97
- self .object :setyaw (self . object : getyaw () + math.pi / 120 + dtime * math.pi / 120 )
100
+ self .object :setyaw (yaw + math.pi / 120 + dtime * math.pi / 120 )
98
101
end
99
102
end
100
103
if ctrl .right then
101
104
if ctrl .down then
102
- self .object :setyaw (self . object : getyaw () + math.pi / 120 + dtime * math.pi / 120 )
105
+ self .object :setyaw (yaw + math.pi / 120 + dtime * math.pi / 120 )
103
106
else
104
- self .object :setyaw (self . object : getyaw () - math.pi / 120 - dtime * math.pi / 120 )
107
+ self .object :setyaw (yaw - math.pi / 120 - dtime * math.pi / 120 )
105
108
end
106
109
end
107
110
end
111
+ local velo = self .object :getvelocity ()
112
+ if self .v == 0 and velo .x == 0 and velo .z == 0 then
113
+ return
114
+ end
108
115
local s = get_sign (self .v )
109
116
self .v = self .v - 0.02 * s
110
117
if s ~= get_sign (self .v ) then
@@ -118,36 +125,40 @@ function boat:on_step(dtime)
118
125
119
126
local p = self .object :getpos ()
120
127
p .y = p .y - 0.5
128
+ local new_velo = {x = 0 ,y = 0 ,z = 0 }
129
+ local new_acce = {x = 0 ,y = 0 ,z = 0 }
121
130
if not is_water (p ) then
122
131
if minetest .registered_nodes [minetest .env :get_node (p ).name ].walkable then
123
132
self .v = 0
124
133
end
125
- self . object : setacceleration ( {x = 0 , y =- 10 , z = 0 })
126
- self . object : setvelocity ( get_velocity (self .v , self .object :getyaw (), self .object :getvelocity ().y ) )
134
+ new_acce = {x = 0 , y =- 10 , z = 0 }
135
+ new_velo = get_velocity (self .v , self .object :getyaw (), self .object :getvelocity ().y )
127
136
else
128
137
p .y = p .y + 1
129
138
if is_water (p ) then
130
- self . object : setacceleration ( {x = 0 , y = 3 , z = 0 })
139
+ new_acce = {x = 0 , y = 3 , z = 0 }
131
140
local y = self .object :getvelocity ().y
132
141
if y > 2 then
133
142
y = 2
134
143
end
135
144
if y < 0 then
136
145
self .object :setacceleration ({x = 0 , y = 10 , z = 0 })
137
146
end
138
- self . object : setvelocity ( get_velocity (self .v , self .object :getyaw (), y ) )
147
+ new_velo = get_velocity (self .v , self .object :getyaw (), y )
139
148
else
140
- self . object : setacceleration ( {x = 0 , y = 0 , z = 0 })
149
+ new_acce = {x = 0 , y = 0 , z = 0 }
141
150
if math.abs (self .object :getvelocity ().y ) < 1 then
142
151
local pos = self .object :getpos ()
143
152
pos .y = math.floor (pos .y )+ 0.5
144
153
self .object :setpos (pos )
145
- self . object : setvelocity ( get_velocity (self .v , self .object :getyaw (), 0 ) )
154
+ new_velo = get_velocity (self .v , self .object :getyaw (), 0 )
146
155
else
147
- self . object : setvelocity ( get_velocity (self .v , self .object :getyaw (), self .object :getvelocity ().y ) )
156
+ new_velo = get_velocity (self .v , self .object :getyaw (), self .object :getvelocity ().y )
148
157
end
149
158
end
150
159
end
160
+ self .object :setvelocity (new_velo )
161
+ self .object :setacceleration (new_acce )
151
162
end
152
163
153
164
minetest .register_entity (" boats:boat" , boat )
@@ -168,8 +179,10 @@ minetest.register_craftitem("boats:boat", {
168
179
return
169
180
end
170
181
pointed_thing .under .y = pointed_thing .under .y + 0.5
171
- minetest .env :add_entity (pointed_thing .under , " boats:boat" )
172
- itemstack :take_item ()
182
+ minetest .add_entity (pointed_thing .under , " boats:boat" )
183
+ if not minetest .setting_getbool (" creative_mode" ) then
184
+ itemstack :take_item ()
185
+ end
173
186
return itemstack
174
187
end ,
175
188
})
0 commit comments