fuel improvement and code cleaning

master
Alexsandro Percy 2021-06-12 23:15:38 -03:00
parent 4a98759b70
commit 3c25a3a5d6
5 changed files with 87 additions and 44 deletions

25
.luacheckrc Normal file
View File

@ -0,0 +1,25 @@
unused_args = false
allow_defined_top = true
globals = {
"minetest",
"mobkit",
"core",
"player_api",
"player_monoids",
"math.sign",
}
read_globals = {
string = {fields = {"split"}},
table = {fields = {"copy", "getn"}},
-- Builtin
"vector", "ItemStack",
"dump", "DIR_DELIM", "VoxelArea", "Settings",
-- MTG
"default", "sfinv", "creative",
}
ignore = {"611"}

View File

@ -6,6 +6,9 @@ minekart.LONGIT_DRAG_FACTOR = 0.16*0.16
minekart.LATER_DRAG_FACTOR = 30.0
minekart.gravity = 9.8
minekart.fuel = {['biofuel:biofuel'] = 1,['biofuel:bottle_fuel'] = 1,
['biofuel:phial_fuel'] = 0.25, ['biofuel:fuel_can'] = 10}
--two variables to control sound event
minekart.last_time_collision_snd = 0
minekart.last_time_drift_snd =0
@ -38,8 +41,6 @@ dofile(minetest.get_modpath("kartcar") .. DIR_DELIM .. "minekart_custom_physics.
-- helpers and co.
--
local creative_exists = minetest.global_exists("creative")
function minekart.get_hipotenuse_value(point1, point2)
return math.sqrt((point1.x - point2.x) ^ 2 + (point1.y - point2.y) ^ 2 + (point1.z - point2.z) ^ 2)
end
@ -62,7 +63,7 @@ function minekart.paint(self, colstr)
self._color = colstr
local l_textures = self.initial_properties.textures
for _, texture in ipairs(l_textures) do
local i,indx = texture:find('kart_painting.png')
local indx = texture:find('kart_painting.png')
if indx then
l_textures[_] = "kart_painting.png^[multiply:".. colstr
end
@ -227,7 +228,10 @@ minetest.register_entity("kartcar:kart", {
stepheight = 0.5,
visual = "mesh",
mesh = "kart_body.b3d",
textures = {"kart_black.png", "kart_painting.png", "kart_painting.png", "kart_red.png", "kart_black.png", "kart_white.png", "kart_black.png", "kart_black.png", "kart_black.png", "kart_black.png", "kart_metal.png", "kart_black.png", "kart_black.png", "kart_metal.png", "kart_black.png", "kart_metal.png",},
textures = {"kart_black.png", "kart_painting.png", "kart_painting.png",
"kart_red.png", "kart_black.png", "kart_white.png", "kart_black.png",
"kart_black.png", "kart_black.png", "kart_black.png", "kart_metal.png",
"kart_black.png", "kart_black.png", "kart_metal.png", "kart_black.png", "kart_metal.png",},
},
textures = {},
driver_name = nil,
@ -320,14 +324,10 @@ minetest.register_entity("kartcar:kart", {
if minekart.last_time_drift_snd > 1 then minekart.last_time_drift_snd = 1 end
--[[end sound control]]--
local accel_y = self.object:get_acceleration().y
local rotation = self.object:get_rotation()
local yaw = rotation.y
local newyaw=yaw
local pitch = rotation.x
local newpitch = pitch
local roll = rotation.z
local newroll=roll
local hull_direction = minetest.yaw_to_dir(yaw)
local nhdir = {x=hull_direction.z,y=0,z=-hull_direction.x} -- lateral unit vector
@ -335,10 +335,12 @@ minetest.register_entity("kartcar:kart", {
local longit_speed = minekart.dot(velocity,hull_direction)
local fuel_weight_factor = (5 - self._energy)/5000
local longit_drag = vector.multiply(hull_direction,(longit_speed*longit_speed) * (minekart.LONGIT_DRAG_FACTOR - fuel_weight_factor) * -1 * minekart.sign(longit_speed))
local longit_drag = vector.multiply(hull_direction,(longit_speed*longit_speed) *
(minekart.LONGIT_DRAG_FACTOR - fuel_weight_factor) * -1 * minekart.sign(longit_speed))
local later_speed = minekart.dot(velocity,nhdir)
local later_drag = vector.multiply(nhdir,later_speed*later_speed*minekart.LATER_DRAG_FACTOR*-1*minekart.sign(later_speed))
local later_drag = vector.multiply(nhdir,later_speed*
later_speed*minekart.LATER_DRAG_FACTOR*-1*minekart.sign(later_speed))
local accel = vector.add(longit_drag,later_drag)
@ -355,11 +357,12 @@ minetest.register_entity("kartcar:kart", {
--reload fuel at refuel point
------------------------------
if self._energy < 0.90 then
if self._energy < 1 then
local speed = minekart.get_hipotenuse_value(vector.new(), self.lastvelocity)
local pos = self.object:get_pos()
if minetest.find_node_near(pos, 5, {"checkpoints:refuel"}) ~= nil and self._engine_running == false and speed <= 0.1 then
minekart_load_fuel(self, self.driver_name, true)
if minetest.find_node_near(pos, 5, {"checkpoints:refuel"}) ~= nil and
self._engine_running == false and speed <= 0.1 then
minekart.loadFuel(self, self.driver_name, true)
end
end
end
@ -382,12 +385,13 @@ minetest.register_entity("kartcar:kart", {
})
end
--[[if self.damage > 100 then --if acumulated damage is greater than 100, adieu
minekart.destroy(self)
minekart.destroy(self)
end]]--
end
local min_later_speed = 0.9
if (later_speed > min_later_speed or later_speed < -min_later_speed) and minekart.last_time_drift_snd > 0.6 then
if (later_speed > min_later_speed or later_speed < -min_later_speed) and
minekart.last_time_drift_snd > 0.6 then
minekart.last_time_drift_snd = 0
minetest.sound_play("drifting", {
to_player = self.driver_name,
@ -419,16 +423,17 @@ minetest.register_entity("kartcar:kart", {
self.dir_bar:set_attach(self.object,'',{x=(-1*(self._steering_angle / 25)),y=0,z=-4},{x=0,y=0,z=0})
self.r_wheel:set_attach(self.object,'',{x= 6,y=2.1,z=10.7},{x=0,y=-self._steering_angle+angle_factor,z=0})
if math.abs(self._steering_angle)>5 then
if math.abs(self._steering_angle)>5 then
local turn_rate = math.rad(60)
newyaw = yaw + dtime*(1 - 1 / (math.abs(longit_speed) + 1)) * self._steering_angle / 30 * turn_rate * minekart.sign(longit_speed)
newyaw = yaw + dtime*(1 - 1 / (math.abs(longit_speed) + 1)) *
self._steering_angle / 30 * turn_rate * minekart.sign(longit_speed)
end
--[[if player and is_attached then
player:set_look_horizontal(newyaw)
end]]--
newpitch = velocity.y * math.rad(6)
local newpitch = velocity.y * math.rad(6)
--[[
accell correction
@ -514,9 +519,8 @@ minetest.register_entity("kartcar:kart", {
]]--
local velocity = self.object:get_velocity()
local speed = minekart.get_hipotenuse_value(vector.new(), velocity)
if is_attached == true and item_name == "biofuel:biofuel" and self._engine_running == false and speed <= 0.1 then
local pos = self.object:get_pos()
minekart_load_fuel(self, puncher:get_player_name())
if is_attached == true and self._engine_running == false and speed <= 0.1 then
minekart.loadFuel(self, puncher:get_player_name())
end
-- end refuel
@ -550,7 +554,8 @@ minetest.register_entity("kartcar:kart", {
else -- deal damage
--minetest.chat_send_all('owner '.. self.owner ..' - name '.. name)
if not self.driver and self.owner == name and toolcaps and toolcaps.damage_groups and toolcaps.damage_groups.fleshy then
if not self.driver and self.owner == name and toolcaps and
toolcaps.damage_groups and toolcaps.damage_groups.fleshy then
self.hp = self.hp - 10
minetest.sound_play("collision", {
object = self.object,
@ -643,8 +648,6 @@ minetest.register_craftitem("kartcar:kart", {
end
local pointed_pos = pointed_thing.above
local node_below = minetest.get_node(pointed_pos).name
local nodedef = minetest.registered_nodes[node_below]
--pointed_pos.y=pointed_pos.y+0.2
local kart = minetest.add_entity(pointed_pos, "kartcar:kart")
if kart and placer then

View File

@ -39,7 +39,6 @@ function minekart.check_road_is_ok(obj)
else
return 0
end
return minekart.max_acc_factor
end
function minekart.kart_control(self, dtime, hull_direction, longit_speed, longit_drag, later_drag, accel)
@ -48,7 +47,6 @@ function minekart.kart_control(self, dtime, hull_direction, longit_speed, longit
local player = minetest.get_player_by_name(self.driver_name)
local retval_accel = accel;
local zero = vector.new()
-- player control
if player then
@ -144,7 +142,9 @@ function minekart.kart_control(self, dtime, hull_direction, longit_speed, longit
local factor = 1
if self._steering_angle > 0 then factor = -1 end
local correction = (steering_limit*(longit_speed/100)) * factor
local before_correction = self._steering_angle
self._steering_angle = self._steering_angle + correction
if math.sign(before_correction) ~= math.sign(self._steering_angle) then self._steering_angle = 0 end
end
end

View File

@ -1,6 +1,5 @@
local min = math.min
local abs = math.abs
local deg = math.deg
function minekart.physics(self)
local vel=self.object:get_velocity()
@ -16,9 +15,9 @@ function minekart.physics(self)
local vnew = vector.new(vel)
if not self.collided then -- ugly workaround for inconsistent collisions
for _,k in ipairs({'y','z','x'}) do
if vel[k]==0 and abs(self.lastvelocity[k])> 0.1 then
vnew[k]=-self.lastvelocity[k]*self.springiness
for _,k in ipairs({'y','z','x'}) do
if vel[k]==0 and abs(self.lastvelocity[k])> 0.1 then
vnew[k]=-self.lastvelocity[k]*self.springiness
end
end
end

View File

@ -2,25 +2,41 @@
-- fuel
--
function minekart_load_fuel(self, player_name, free)
function minekart.contains(table, val)
for k,v in pairs(table) do
if k == val then
return v
end
end
return false
end
function minekart.loadFuel(self, player_name, free)
free = free or false
if self._energy < 0.90 then
if self._energy < 1 then
local player = minetest.get_player_by_name(player_name)
local inv = player:get_inventory()
local inventory_fuel = "biofuel:biofuel"
if inv:contains_item("main", inventory_fuel) or free == true then
if free == false then
local stack = ItemStack(inventory_fuel .. " 1")
local taken = inv:remove_item("main", stack)
local itmstck=player:get_wielded_item()
local item_name = ""
if itmstck then item_name = itmstck:get_name() end
local fuel = minekart.contains(minekart.fuel, item_name)
if fuel or free == true then
local stack = ItemStack(item_name .. " 1")
if self._energy < 1 then
if free == false then inv:remove_item("main", stack) end
self._energy = self._energy + fuel
if self._energy > 1 then self._energy = 1 end
minekart.last_fuel_display = 0
if self._energy == 1 then minetest.chat_send_player(player_name, "Full tank!") end
end
self._energy = self._energy + 1
if self._energy > 1 then self._energy = 1 end
minekart.last_fuel_display = 0
minetest.chat_send_player(player_name, "Full tank!")
end
return true
end
else
minetest.chat_send_player(player_name, "No refuel for you! You have more than 90% of fuel in the tank.")
minetest.chat_send_player(player_name, "No refuel for you! Your tank is already full.")
end
return false
end