From b11a4c95e3173bee3d33282015e4d0283b13d7f9 Mon Sep 17 00:00:00 2001 From: Alexsandro Percy Date: Tue, 12 Sep 2023 10:42:51 -0300 Subject: [PATCH] creating new shared methods --- automobiles_coupe/coupe_crafts.lua | 2 +- automobiles_coupe/coupe_entities.lua | 123 +---------------- automobiles_coupe/coupe_utilities.lua | 78 ----------- automobiles_coupe/init.lua | 5 +- automobiles_coupe/sounds/coupe_engine.ogg | Bin 43963 -> 19632 bytes automobiles_lib/entities.lua | 118 ++++++++++++++++ .../formspecs.lua | 56 ++++---- automobiles_lib/init.lua | 80 +++++++++++ .../sounds/automobiles_collision.ogg | Bin 0 -> 9748 bytes automobiles_trans_am/crafts.lua | 2 +- automobiles_trans_am/entities.lua | 127 ++---------------- automobiles_trans_am/forms.lua | 83 ------------ automobiles_trans_am/init.lua | 6 +- automobiles_trans_am/utilities.lua | 78 ----------- 14 files changed, 246 insertions(+), 512 deletions(-) delete mode 100755 automobiles_coupe/coupe_utilities.lua mode change 100755 => 100644 automobiles_coupe/sounds/coupe_engine.ogg create mode 100644 automobiles_lib/entities.lua rename automobiles_coupe/coupe_forms.lua => automobiles_lib/formspecs.lua (54%) mode change 100755 => 100644 create mode 100755 automobiles_lib/sounds/automobiles_collision.ogg delete mode 100644 automobiles_trans_am/forms.lua delete mode 100755 automobiles_trans_am/utilities.lua diff --git a/automobiles_coupe/coupe_crafts.lua b/automobiles_coupe/coupe_crafts.lua index 004bfce..2b786bf 100755 --- a/automobiles_coupe/coupe_crafts.lua +++ b/automobiles_coupe/coupe_crafts.lua @@ -34,7 +34,7 @@ minetest.register_craftitem("automobiles_coupe:coupe", { itemstack:take_item() ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) automobiles_lib.setText(ent, "Coupe") - automobiles_lib.create_inventory(ent, coupe.trunk_slots, owner) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) end end diff --git a/automobiles_coupe/coupe_entities.lua b/automobiles_coupe/coupe_entities.lua index 20141a1..a7f2dda 100755 --- a/automobiles_coupe/coupe_entities.lua +++ b/automobiles_coupe/coupe_entities.lua @@ -301,6 +301,9 @@ minetest.register_entity("automobiles_coupe:coupe", { _inv_id = "", _change_color = automobiles_lib.paint, _intensity = 4, + _trunk_slots = 8, + _engine_sound = "coupe_engine", + _max_fuel = 10, get_staticdata = function(self) -- unloaded/unloads ... is now saved return minetest.serialize({ @@ -431,7 +434,7 @@ minetest.register_entity("automobiles_coupe:coupe", { local inv = minetest.get_inventory({type = "detached", name = self._inv_id}) -- if the game was closed the inventories have to be made anew, instead of just reattached if not inv then - automobiles_lib.create_inventory(self, coupe.trunk_slots) + automobiles_lib.create_inventory(self, self._trunk_slots) else self.inv = inv end @@ -646,7 +649,7 @@ minetest.register_entity("automobiles_coupe:coupe", { self._last_engine_sound_update = self._last_engine_sound_update + dtime if self._last_engine_sound_update > 0.300 then self._last_engine_sound_update = 0 - coupe.engine_set_sound_and_animation(self, longit_speed) + automobiles_lib.engine_set_sound_and_animation(self, longit_speed) end end @@ -682,121 +685,9 @@ minetest.register_entity("automobiles_coupe:coupe", { end, - on_punch = function(self, puncher, ttime, toolcaps, dir, damage) - if not puncher or not puncher:is_player() then - return - end + on_punch = automobiles_lib.on_punch, - local name = puncher:get_player_name() - --[[if self.owner and self.owner ~= name and self.owner ~= "" then return end]]-- - if self.owner == nil then - self.owner = name - end - - if self.driver_name and self.driver_name ~= name then - -- do not allow other players to remove the object while there is a driver - return - end - - local is_attached = false - if puncher:get_attach() == self.driver_seat then is_attached = true end - - local itmstck=puncher:get_wielded_item() - local item_name = "" - if itmstck then item_name = itmstck:get_name() end - - --refuel procedure - --[[ - refuel works it car is stopped and engine is off - ]]-- - local velocity = self.object:get_velocity() - local speed = automobiles_lib.get_hipotenuse_value(vector.new(), velocity) - if math.abs(speed) <= 0.1 then - if automobiles_lib.loadFuel(self, puncher:get_player_name(), false, coupe.max_fuel) then return end - end - -- end refuel - - if is_attached == false then - - -- deal with painting or destroying - if itmstck then - --race status restart - if item_name == "checkpoints:status_restarter" and self._engine_running == false then - --restart race current status - self._last_checkpoint = "" - self._total_laps = -1 - self._race_id = "" - return - end - - if automobiles_lib.set_paint(self, puncher, itmstck) == false then - local is_admin = false - is_admin = minetest.check_player_privs(puncher, {server=true}) - --minetest.chat_send_all('owner '.. self.owner ..' - name '.. name) - if not self.driver and (self.owner == name or is_admin == true) and toolcaps and - toolcaps.damage_groups and toolcaps.damage_groups.fleshy then - self.hp = self.hp - 10 - minetest.sound_play("collision", { - object = self.object, - max_hear_distance = 5, - gain = 1.0, - fade = 0.0, - pitch = 1.0, - }) - end - end - end - - if self.hp <= 0 then - coupe.destroy(self) - end - - end - - end, - - on_rightclick = function(self, clicker) - if not clicker or not clicker:is_player() then - return - end - - local name = clicker:get_player_name() - --[[if self.owner and self.owner ~= name and self.owner ~= "" then return end]]-- - if self.owner == "" then - self.owner = name - end - - if name == self.driver_name then - coupe.driver_formspec(name) - else - if name == self.owner then - if clicker:get_player_control().aux1 == true then - automobiles_lib.show_vehicle_trunk_formspec(self, clicker, coupe.trunk_slots) - else - --is the owner, okay, lets attach - automobiles_lib.attach_driver(self, clicker) - -- sound - self.sound_handle = minetest.sound_play({name = "automobiles_engine"}, - {object = self.object, gain = 4, pitch = 1, max_hear_distance = 30, loop = true,}) - end - else - --minetest.chat_send_all("clicou") - --a passenger - if self._passenger == nil then - --there is no passenger, so lets attach - if self.driver_name then - automobiles_lib.attach_pax(self, clicker, true) - end - else - --there is a passeger - if self._passenger == name then - --if you are the psenger, so deattach - automobiles_lib.dettach_pax(self, clicker) - end - end - end - end - end, + on_rightclick = automobiles_lib.on_rightclick, }) diff --git a/automobiles_coupe/coupe_utilities.lua b/automobiles_coupe/coupe_utilities.lua deleted file mode 100755 index a6f96da..0000000 --- a/automobiles_coupe/coupe_utilities.lua +++ /dev/null @@ -1,78 +0,0 @@ ---dofile(minetest.get_modpath("automobiles_coupe") .. DIR_DELIM .. "coupe_global_definitions.lua") ---dofile(minetest.get_modpath("automobiles_coupe") .. DIR_DELIM .. "coupe_hud.lua") - --- destroy the coupe -function coupe.destroy(self, puncher) - automobiles_lib.remove_light(self) - if self.sound_handle then - minetest.sound_stop(self.sound_handle) - self.sound_handle = nil - end - - if self.driver_name then - -- detach the driver first (puncher must be driver) - if puncher then - puncher:set_detach() - puncher:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) - if minetest.global_exists("player_api") then - player_api.player_attached[self.driver_name] = nil - -- player should stand again - player_api.set_animation(puncher, "stand") - end - end - self.driver_name = nil - end - - local pos = self.object:get_pos() - - if self.front_suspension then self.front_suspension:remove() end - if self.lf_wheel then self.lf_wheel:remove() end - if self.rf_wheel then self.rf_wheel:remove() end - if self.rear_suspension then self.rear_suspension:remove() end - if self.lr_wheel then self.lr_wheel:remove() end - if self.rr_wheel then self.rr_wheel:remove() end - if self.steering then self.steering:remove() end - if self.steering_axis then self.steering_axis:remove() end - if self.driver_seat then self.driver_seat:remove() end - if self.passenger_seat then self.passenger_seat:remove() end - if self.fuel_gauge then self.fuel_gauge:remove() end - if self.lights then self.lights:remove() end - if self.r_lights then self.r_lights:remove() end - if self.reverse_lights then self.reverse_lights:remove() end - if self.turn_l_light then self.turn_l_light:remove() end - if self.turn_r_light then self.turn_r_light:remove() end - - automobiles_lib.destroy_inventory(self) - self.object:remove() - - pos.y=pos.y+2 - - --minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_coupe:coupe') - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:engine') - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') -end - -function coupe.engine_set_sound_and_animation(self, _longit_speed) - --minetest.chat_send_all('test1 ' .. dump(self._engine_running) ) - if self.sound_handle then - if (math.abs(self._longit_speed) > math.abs(_longit_speed) + 0.03) or (math.abs(self._longit_speed) + 0.03 < math.abs(_longit_speed)) then - --minetest.chat_send_all('test2') - coupe.engineSoundPlay(self) - end - end -end - -function coupe.engineSoundPlay(self) - --sound - if self.sound_handle then minetest.sound_stop(self.sound_handle) end - if self.object then - self.sound_handle = minetest.sound_play({name = "automobiles_engine"}, - {object = self.object, gain = 8, - pitch = 1 + ((self._longit_speed/10)/2), - max_hear_distance = 10, - loop = true,}) - end -end diff --git a/automobiles_coupe/init.lua b/automobiles_coupe/init.lua index 3bafdfe..db357a9 100755 --- a/automobiles_coupe/init.lua +++ b/automobiles_coupe/init.lua @@ -7,8 +7,6 @@ coupe.LATER_DRAG_FACTOR = 18.0 coupe.gravity = automobiles_lib.gravity coupe.max_speed = 22 coupe.max_acc_factor = 8 -coupe.max_fuel = 10 -coupe.trunk_slots = 8 COUPE_GAUGE_FUEL_POSITION = {x=0,y=6.2,z=15.8} @@ -19,9 +17,8 @@ dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "custom_physics.l dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "control.lua") dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management.lua") dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") -dofile(minetest.get_modpath("automobiles_coupe") .. DIR_DELIM .. "coupe_utilities.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "entities.lua") dofile(minetest.get_modpath("automobiles_coupe") .. DIR_DELIM .. "coupe_entities.lua") -dofile(minetest.get_modpath("automobiles_coupe") .. DIR_DELIM .. "coupe_forms.lua") dofile(minetest.get_modpath("automobiles_coupe") .. DIR_DELIM .. "coupe_crafts.lua") diff --git a/automobiles_coupe/sounds/coupe_engine.ogg b/automobiles_coupe/sounds/coupe_engine.ogg old mode 100755 new mode 100644 index 3284d80aa5910b08c600c7b13568bf96e2dc154e..ba166be1278605c0095a813eec51ab7a28f2309d GIT binary patch delta 18304 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 diff --git a/automobiles_lib/entities.lua b/automobiles_lib/entities.lua new file mode 100644 index 0000000..ae8a6f4 --- /dev/null +++ b/automobiles_lib/entities.lua @@ -0,0 +1,118 @@ + +function automobiles_lib.on_rightclick (self, clicker) + if not clicker or not clicker:is_player() then + return + end + + local name = clicker:get_player_name() + --[[if self.owner and self.owner ~= name and self.owner ~= "" then return end]]-- + if self.owner == "" then + self.owner = name + end + + if name == self.driver_name then + automobiles_lib.driver_formspec(name) + else + if name == self.owner then + if clicker:get_player_control().aux1 == true then + automobiles_lib.show_vehicle_trunk_formspec(self, clicker, self._trunk_slots) + else + --is the owner, okay, lets attach + automobiles_lib.attach_driver(self, clicker) + -- sound + self.sound_handle = minetest.sound_play({name = self._engine_sound}, + {object = self.object, gain = 1.5, pitch = 1, max_hear_distance = 30, loop = true,}) + end + else + --minetest.chat_send_all("clicou") + --a passenger + if self._passenger == nil then + --there is no passenger, so lets attach + if self.driver_name then + automobiles_lib.attach_pax(self, clicker, true) + end + else + --there is a passeger + if self._passenger == name then + --if you are the psenger, so deattach + automobiles_lib.dettach_pax(self, clicker) + end + end + end + end +end + +function automobiles_lib.on_punch (self, puncher, ttime, toolcaps, dir, damage) + if not puncher or not puncher:is_player() then + return + end + + local name = puncher:get_player_name() + --[[if self.owner and self.owner ~= name and self.owner ~= "" then return end]]-- + if self.owner == nil then + self.owner = name + end + + if self.driver_name and self.driver_name ~= name then + -- do not allow other players to remove the object while there is a driver + return + end + + local is_attached = false + if puncher:get_attach() == self.driver_seat then is_attached = true end + + local itmstck=puncher:get_wielded_item() + local item_name = "" + if itmstck then item_name = itmstck:get_name() end + + --refuel procedure + --[[ + refuel works it car is stopped and engine is off + ]]-- + local velocity = self.object:get_velocity() + local speed = automobiles_lib.get_hipotenuse_value(vector.new(), velocity) + if math.abs(speed) <= 0.1 then + if automobiles_lib.loadFuel(self, puncher:get_player_name(), false, self._max_fuel) then return end + end + -- end refuel + + if is_attached == false then + + -- deal with painting or destroying + if itmstck then + --race status restart + if item_name == "checkpoints:status_restarter" and self._engine_running == false then + --restart race current status + self._last_checkpoint = "" + self._total_laps = -1 + self._race_id = "" + return + end + + local paint_f = automobiles_lib.set_paint + if self._painting_function then paint_f = self._painting_function end + if paint_f(self, puncher, itmstck) == false then + local is_admin = false + is_admin = minetest.check_player_privs(puncher, {server=true}) + --minetest.chat_send_all('owner '.. self.owner ..' - name '.. name) + if not self.driver and (self.owner == name or is_admin == true) and toolcaps and + toolcaps.damage_groups and toolcaps.damage_groups.fleshy then + self.hp = self.hp - 10 + minetest.sound_play("automobiles_collision", { + object = self.object, + max_hear_distance = 5, + gain = 1.0, + fade = 0.0, + pitch = 1.0, + }) + end + end + end + + if self.hp <= 0 then + automobiles_lib.destroy(self) + end + + end + +end diff --git a/automobiles_coupe/coupe_forms.lua b/automobiles_lib/formspecs.lua old mode 100755 new mode 100644 similarity index 54% rename from automobiles_coupe/coupe_forms.lua rename to automobiles_lib/formspecs.lua index 9abcfd2..6ec5499 --- a/automobiles_coupe/coupe_forms.lua +++ b/automobiles_lib/formspecs.lua @@ -1,9 +1,6 @@ --------------- --- Manual -- --------------- -function coupe.getCarFromPlayer(player) +function automobiles_lib.getCarFromPlayer(player) local seat = player:get_attach() if seat then local car = seat:get_attach() @@ -12,43 +9,46 @@ function coupe.getCarFromPlayer(player) return nil end -function coupe.driver_formspec(name) +function automobiles_lib.driver_formspec(name) local player = minetest.get_player_by_name(name) - local vehicle_obj = coupe.getCarFromPlayer(player) - if vehicle_obj == nil then - return + if player then + local vehicle_obj = automobiles_lib.getCarFromPlayer(player) + if vehicle_obj == nil then + return + end + local ent = vehicle_obj:get_luaentity() + + if ent then + local yaw = "false" + if ent._yaw_by_mouse then yaw = "true" end + + local basic_form = table.concat({ + "formspec_version[3]", + "size[6,7]", + }, "") + + basic_form = basic_form.."button[1,1.0;4,1;go_out;Go Offboard]" + basic_form = basic_form.."button[1,2.5;4,1;lights;Lights]" + basic_form = basic_form.."checkbox[1,5.5;yaw;Direction by mouse;"..yaw.."]" + + minetest.show_formspec(name, "automobiles_lib:driver_main", basic_form) + end end - local ent = vehicle_obj:get_luaentity() - - local yaw = "false" - if ent._yaw_by_mouse then yaw = "true" end - - local basic_form = table.concat({ - "formspec_version[3]", - "size[6,7]", - }, "") - - basic_form = basic_form.."button[1,1.0;4,1;go_out;Go Offboard]" - basic_form = basic_form.."button[1,2.5;4,1;lights;Lights]" - basic_form = basic_form.."checkbox[1,5.5;yaw;Direction by mouse;"..yaw.."]" - - minetest.show_formspec(name, "coupe:driver_main", basic_form) end minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname == "coupe:driver_main" then + if formname == "automobiles_lib:driver_main" then local name = player:get_player_name() - local car_obj = coupe.getCarFromPlayer(player) + local car_obj = automobiles_lib.getCarFromPlayer(player) if car_obj then local ent = car_obj:get_luaentity() if ent then if fields.go_out then - if ent._passenger then --any pax? local pax_obj = minetest.get_player_by_name(ent._passenger) automobiles_lib.dettach_pax(ent, pax_obj) end - + ent._is_flying = 0 automobiles_lib.dettach_driver(ent, player) end if fields.lights then @@ -67,6 +67,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end end - minetest.close_formspec(name, "coupe:driver_main") + minetest.close_formspec(name, "automobiles_lib:driver_main") end end) diff --git a/automobiles_lib/init.lua b/automobiles_lib/init.lua index 3212750..03eab37 100755 --- a/automobiles_lib/init.lua +++ b/automobiles_lib/init.lua @@ -355,6 +355,85 @@ function automobiles_lib.put_light(self) end +function automobiles_lib.destroy(self, puncher) + automobiles_lib.remove_light(self) + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + self.sound_handle = nil + end + + if self.driver_name then + -- detach the driver first (puncher must be driver) + if puncher then + puncher:set_detach() + puncher:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + if minetest.global_exists("player_api") then + player_api.player_attached[self.driver_name] = nil + -- player should stand again + player_api.set_animation(puncher, "stand") + end + end + self.driver_name = nil + end + + local pos = self.object:get_pos() + + if self.front_suspension then self.front_suspension:remove() end + if self.lf_wheel then self.lf_wheel:remove() end + if self.rf_wheel then self.rf_wheel:remove() end + if self.rear_suspension then self.rear_suspension:remove() end + if self.lr_wheel then self.lr_wheel:remove() end + if self.rr_wheel then self.rr_wheel:remove() end + if self.steering then self.steering:remove() end + if self.steering_axis then self.steering_axis:remove() end + if self.driver_seat then self.driver_seat:remove() end + if self.passenger_seat then self.passenger_seat:remove() end + if self.fuel_gauge then self.fuel_gauge:remove() end + if self.lights then self.lights:remove() end + if self.r_lights then self.r_lights:remove() end + if self.reverse_lights then self.reverse_lights:remove() end + if self.turn_l_light then self.turn_l_light:remove() end + if self.turn_r_light then self.turn_r_light:remove() end + + automobiles_lib.destroy_inventory(self) + self.object:remove() + + pos.y=pos.y+2 + + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:engine') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') +end + +function automobiles_lib.engine_set_sound_and_animation(self, _longit_speed) + --minetest.chat_send_all('test1 ' .. dump(self._engine_running) ) + if self.sound_handle then + if (math.abs(self._longit_speed) > math.abs(_longit_speed) + 0.03) or (math.abs(self._longit_speed) + 0.03 < math.abs(_longit_speed)) then + --minetest.chat_send_all('test2') + automobiles_lib.engineSoundPlay(self) + end + end +end + +function automobiles_lib.engineSoundPlay(self) + --sound + if self.sound_handle then minetest.sound_stop(self.sound_handle) end + if self.object then + local snd_pitch = 1 + ((self._longit_speed/10)/2) + if self._transmission_state == 1 then + snd_pitch = 1 + (self._longit_speed/10) + end + + self.sound_handle = minetest.sound_play({name = self._engine_sound}, + {object = self.object, gain = 4, + pitch = snd_pitch, + max_hear_distance = 15, + loop = true,}) + end +end + minetest.register_node("automobiles_lib:light", { drawtype = "airlike", --tile_images = {"automobiles_light.png"}, @@ -461,6 +540,7 @@ dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management. dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "painter.lua") dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "inventory_management.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "formspecs.lua") -- engine minetest.register_craftitem("automobiles_lib:engine",{ diff --git a/automobiles_lib/sounds/automobiles_collision.ogg b/automobiles_lib/sounds/automobiles_collision.ogg new file mode 100755 index 0000000000000000000000000000000000000000..b15fbb1e32a9d835cafc186d1565eac3d63d41ab GIT binary patch literal 9748 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 KXtVn2mH!9hX=}d# literal 0 HcmV?d00001 diff --git a/automobiles_trans_am/crafts.lua b/automobiles_trans_am/crafts.lua index 9e29536..6bc0e28 100644 --- a/automobiles_trans_am/crafts.lua +++ b/automobiles_trans_am/crafts.lua @@ -35,7 +35,7 @@ minetest.register_craftitem("automobiles_trans_am:trans_am", { itemstack:take_item() ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) automobiles_lib.setText(ent, "Trans Am") - automobiles_lib.create_inventory(ent, trans_am.trunk_slots, owner) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) end end diff --git a/automobiles_trans_am/entities.lua b/automobiles_trans_am/entities.lua index 4dd030f..ed19535 100755 --- a/automobiles_trans_am/entities.lua +++ b/automobiles_trans_am/entities.lua @@ -253,7 +253,7 @@ local function paint(self, colstr) self.object:set_properties({textures=l_textures}) end -function set_paint(self, puncher, itmstck) +function trans_am.set_paint(self, puncher, itmstck) local item_name = "" if itmstck then item_name = itmstck:get_name() end @@ -365,6 +365,10 @@ minetest.register_entity("automobiles_trans_am:trans_am", { _car_gravity = -automobiles_lib.gravity, --acc control _transmission_state = 1, + _painting_function = trans_am.set_paint, + _trunk_slots = 12, + _engine_sound = "trans_am_engine", + _max_fuel = 10, get_staticdata = function(self) -- unloaded/unloads ... is now saved return minetest.serialize({ @@ -496,7 +500,7 @@ minetest.register_entity("automobiles_trans_am:trans_am", { local inv = minetest.get_inventory({type = "detached", name = self._inv_id}) -- if the game was closed the inventories have to be made anew, instead of just reattached if not inv then - automobiles_lib.create_inventory(self, trans_am.trunk_slots) + automobiles_lib.create_inventory(self, self._trunk_slots) else self.inv = inv end @@ -752,7 +756,7 @@ minetest.register_entity("automobiles_trans_am:trans_am", { self._last_engine_sound_update = self._last_engine_sound_update + dtime if self._last_engine_sound_update > 0.300 then self._last_engine_sound_update = 0 - trans_am.engine_set_sound_and_animation(self, longit_speed) + automobiles_lib.engine_set_sound_and_animation(self, longit_speed) end end @@ -798,121 +802,8 @@ minetest.register_entity("automobiles_trans_am:trans_am", { end, - on_punch = function(self, puncher, ttime, toolcaps, dir, damage) - if not puncher or not puncher:is_player() then - return - end - - local name = puncher:get_player_name() - --[[if self.owner and self.owner ~= name and self.owner ~= "" then return end]]-- - if self.owner == nil then - self.owner = name - end - - if self.driver_name and self.driver_name ~= name then - -- do not allow other players to remove the object while there is a driver - return - end - - local is_attached = false - if puncher:get_attach() == self.driver_seat then is_attached = true end - - local itmstck=puncher:get_wielded_item() - local item_name = "" - if itmstck then item_name = itmstck:get_name() end - - --refuel procedure - --[[ - refuel works it car is stopped and engine is off - ]]-- - local velocity = self.object:get_velocity() - local speed = automobiles_lib.get_hipotenuse_value(vector.new(), velocity) - if math.abs(speed) <= 0.1 then - if automobiles_lib.loadFuel(self, puncher:get_player_name(), false, trans_am.max_fuel) then return end - end - -- end refuel - - if is_attached == false then - - -- deal with painting or destroying - if itmstck then - --race status restart - if item_name == "checkpoints:status_restarter" and self._engine_running == false then - --restart race current status - self._last_checkpoint = "" - self._total_laps = -1 - self._race_id = "" - return - end - - if set_paint(self, puncher, itmstck) == false then - local is_admin = false - is_admin = minetest.check_player_privs(puncher, {server=true}) - --minetest.chat_send_all('owner '.. self.owner ..' - name '.. name) - if not self.driver and (self.owner == name or is_admin == true) and toolcaps and - toolcaps.damage_groups and toolcaps.damage_groups.fleshy then - self.hp = self.hp - 10 - minetest.sound_play("collision", { - object = self.object, - max_hear_distance = 5, - gain = 1.0, - fade = 0.0, - pitch = 1.0, - }) - end - end - end - - if self.hp <= 0 then - trans_am.destroy(self) - end - - end - - end, - - on_rightclick = function(self, clicker) - if not clicker or not clicker:is_player() then - return - end - - local name = clicker:get_player_name() - --[[if self.owner and self.owner ~= name and self.owner ~= "" then return end]]-- - if self.owner == "" then - self.owner = name - end - - if name == self.driver_name then - trans_am.driver_formspec(name) - else - if name == self.owner then - if clicker:get_player_control().aux1 == true then - automobiles_lib.show_vehicle_trunk_formspec(self, clicker, trans_am.trunk_slots) - else - --is the owner, okay, lets attach - automobiles_lib.attach_driver(self, clicker) - -- sound - self.sound_handle = minetest.sound_play({name = trans_am.engine_sound}, - {object = self.object, gain = 1.5, pitch = 1, max_hear_distance = 30, loop = true,}) - end - else - --minetest.chat_send_all("clicou") - --a passenger - if self._passenger == nil then - --there is no passenger, so lets attach - if self.driver_name then - automobiles_lib.attach_pax(self, clicker, true) - end - else - --there is a passeger - if self._passenger == name then - --if you are the psenger, so deattach - automobiles_lib.dettach_pax(self, clicker) - end - end - end - end - end, + on_punch = automobiles_lib.on_punch, + on_rightclick = automobiles_lib.on_rightclick, }) diff --git a/automobiles_trans_am/forms.lua b/automobiles_trans_am/forms.lua deleted file mode 100644 index 85d3b81..0000000 --- a/automobiles_trans_am/forms.lua +++ /dev/null @@ -1,83 +0,0 @@ - --------------- --- Manual -- --------------- - -function trans_am.getCarFromPlayer(player) - local seat = player:get_attach() - if seat then - local car = seat:get_attach() - return car - end - return nil -end - -function trans_am.driver_formspec(name) - local player = minetest.get_player_by_name(name) - local vehicle_obj = trans_am.getCarFromPlayer(player) - if vehicle_obj == nil then - return - end - local ent = vehicle_obj:get_luaentity() - - local yaw = "false" - if ent._yaw_by_mouse then yaw = "true" end - - local flight = "false" - if ent._is_flying == 1 then flight = "true" end - - local basic_form = table.concat({ - "formspec_version[3]", - "size[6,7]", - }, "") - - basic_form = basic_form.."button[1,1.0;4,1;go_out;Go Offboard]" - basic_form = basic_form.."button[1,2.5;4,1;lights;Lights]" - if ent._trans_am_type == 1 then basic_form = basic_form.."checkbox[1,4.0;flight;Flight Mode;"..flight.."]" end - basic_form = basic_form.."checkbox[1,5.5;yaw;Direction by mouse;"..yaw.."]" - - minetest.show_formspec(name, "trans_am:driver_main", basic_form) -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname == "trans_am:driver_main" then - local name = player:get_player_name() - local car_obj = trans_am.getCarFromPlayer(player) - if car_obj then - local ent = car_obj:get_luaentity() - if ent then - if fields.go_out then - if ent._passenger then --any pax? - local pax_obj = minetest.get_player_by_name(ent._passenger) - automobiles_lib.dettach_pax(ent, pax_obj) - end - ent._is_flying = 0 - automobiles_lib.dettach_driver(ent, player) - end - if fields.lights then - if ent._show_lights == true then - ent._show_lights = false - else - ent._show_lights = true - end - end - if fields.yaw then - if ent._yaw_by_mouse == true then - ent._yaw_by_mouse = false - else - ent._yaw_by_mouse = true - end - end - if fields.flight then - if ent._is_flying == 1 then - ent._is_flying = 0 - else - ent._is_flying = 1 - end - trans_am.turn_flight_mode(ent) - end - end - end - minetest.close_formspec(name, "trans_am:driver_main") - end -end) diff --git a/automobiles_trans_am/init.lua b/automobiles_trans_am/init.lua index 3f53c5e..08ece21 100755 --- a/automobiles_trans_am/init.lua +++ b/automobiles_trans_am/init.lua @@ -7,10 +7,7 @@ trans_am.LATER_DRAG_FACTOR = 6.0 trans_am.gravity = automobiles_lib.gravity trans_am.max_speed = 40 trans_am.max_acc_factor = 12 -trans_am.max_fuel = 10 -trans_am.trunk_slots = 12 trans_am.ideal_step = 0.2 -trans_am.engine_sound = "trans_am_engine" trans_am_GAUGE_FUEL_POSITION = {x=-4,y=6.8,z=16.6} @@ -21,9 +18,8 @@ dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "custom_physics.l dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management.lua") dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "control.lua") -dofile(minetest.get_modpath("automobiles_trans_am") .. DIR_DELIM .. "utilities.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "entities.lua") dofile(minetest.get_modpath("automobiles_trans_am") .. DIR_DELIM .. "entities.lua") -dofile(minetest.get_modpath("automobiles_trans_am") .. DIR_DELIM .. "forms.lua") dofile(minetest.get_modpath("automobiles_trans_am") .. DIR_DELIM .. "crafts.lua") diff --git a/automobiles_trans_am/utilities.lua b/automobiles_trans_am/utilities.lua deleted file mode 100755 index 2e5f4a0..0000000 --- a/automobiles_trans_am/utilities.lua +++ /dev/null @@ -1,78 +0,0 @@ --- destroy the trans_am -function trans_am.destroy(self, puncher) - automobiles_lib.remove_light(self) - if self.sound_handle then - minetest.sound_stop(self.sound_handle) - self.sound_handle = nil - end - - if self.driver_name then - -- detach the driver first (puncher must be driver) - if puncher then - puncher:set_detach() - puncher:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) - if minetest.global_exists("player_api") then - player_api.player_attached[self.driver_name] = nil - -- player should stand again - player_api.set_animation(puncher, "stand") - end - end - self.driver_name = nil - end - - local pos = self.object:get_pos() - - if self.front_suspension then self.front_suspension:remove() end - if self.lf_wheel then self.lf_wheel:remove() end - if self.rf_wheel then self.rf_wheel:remove() end - if self.rear_suspension then self.rear_suspension:remove() end - if self.lr_wheel then self.lr_wheel:remove() end - if self.rr_wheel then self.rr_wheel:remove() end - if self.driver_seat then self.driver_seat:remove() end - if self.passenger_seat then self.passenger_seat:remove() end - if self.fuel_gauge then self.fuel_gauge:remove() end - if self.lights then self.lights:remove() end - if self.r_lights then self.r_lights:remove() end - if self.turn_l_light then self.turn_l_light:remove() end - if self.turn_r_light then self.turn_r_light:remove() end - if self.reverse_lights then self.reverse_lights:remove() end - - automobiles_lib.destroy_inventory(self) - self.object:remove() - - pos.y=pos.y+2 - - --minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_trans_am:trans_am') - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:engine') - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') - minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') -end - -function trans_am.engine_set_sound_and_animation(self, _longit_speed) - --minetest.chat_send_all('test1 ' .. dump(self._engine_running) ) - if self.sound_handle then - if (math.abs(self._longit_speed) > math.abs(_longit_speed) + 0.03) or (math.abs(self._longit_speed) + 0.03 < math.abs(_longit_speed)) then - --minetest.chat_send_all('test2') - trans_am.engineSoundPlay(self) - end - end -end - -function trans_am.engineSoundPlay(self) - --sound - if self.sound_handle then minetest.sound_stop(self.sound_handle) end - if self.object then - local snd_pitch = 1 + ((self._longit_speed/10)/2) - if self._transmission_state == 1 then - snd_pitch = 1 + (self._longit_speed/10) - end - - self.sound_handle = minetest.sound_play({name = trans_am.engine_sound}, - {object = self.object, gain = 4, - pitch = snd_pitch, - max_hear_distance = 15, - loop = true,}) - end -end