mod planes and minimap

ozkur
Member
Posts: 180
Joined: Wed Oct 07, 2015 20:59
In-game: ozkur or XoRoUZ
Location: 6 minutes in the future

Re: mod planes and minimap

by ozkur » Post

here we go!
Attachments
biplane.zip
(219.77 KiB) Downloaded 64 times
Biplanes! 'Nuff said

I am a native English speaker, Ich spreche kein Deuscht, mais je parle un pue français.

ozkur
Member
Posts: 180
Joined: Wed Oct 07, 2015 20:59
In-game: ozkur or XoRoUZ
Location: 6 minutes in the future

Re: mod planes and minimap

by ozkur » Post

i put it up in WIP mods!
Biplanes! 'Nuff said

I am a native English speaker, Ich spreche kein Deuscht, mais je parle un pue français.

User avatar
TumeniNodes
Member
Posts: 2943
Joined: Fri Feb 26, 2016 19:49
GitHub: TumeniNodes
IRC: tumeninodes
In-game: TumeniNodes
Location: in the dark recesses of the mind
Contact:

Re: mod planes and minimap

by TumeniNodes » Post

ozkur wrote:#1:yes. yes.
#2:Um...I don't want to really use my email...Which is apparently required.

Also the code is here, proving it works.

Code: Select all

local function get_sign(i)
	if i == 0 then
		return 0
	else
		return i/math.abs(i)
	end
end

local plane = {
	physical = true,
	collisionbox = {-1,-1.4,-1, 1,0.3,1},
	makes_footstep_sound = false,
	collide_with_objects = true,
	
	visual = "mesh",
	mesh = "root.x",
	--Player
	driver = nil,
	
	--plane mesh
	model = nil,
	--Rotation
	yaw=0,
	--Speeds
	vx=0,
	vy=0,
	vz=0,
	soundHandle=nil
	
	
}
local planeModel = {
	visual = "mesh",
	mesh = "biplane.b3d",
	textures = {"biplane.png"},
}	

function plane:on_rightclick(clicker)
	if not clicker or not clicker:is_player() then
		return
	end
	if self.driver and clicker == self.driver then
		clicker:set_detach()
		self.driver = nil
		minetest.sound_stop(self.soundHandle)
	elseif not self.driver then
		self.soundHandle=minetest.sound_play({name="biplane_motor"},{object = self.object, gain = 2.0, max_hear_distance = 32, loop = true,})
		self.driver = clicker
		clicker:set_attach(self.model, "", {x=0,y=4,z=0}, {x=0,y=0,z=0})
	end
end

function planeModel:on_activate(staticdata, dtime_s)
	self.object:set_armor_groups({immortal=1})
	local is_attached = false
	for _,object in ipairs(minetest.env:get_objects_inside_radius(self.object:getpos(), 2)) do
		if object and object:get_luaentity() and object:get_luaentity().name=="biplane:plane" then
			if object:get_luaentity().model == nil then
				object:get_luaentity().model = self
			end
			if object:get_luaentity().model == self then
				is_attached = true
			end
		end
	end
	if is_attached == false then
		self.object:remove()
	end
	
end

function plane:on_activate(staticdata, dtime_s)
	self.object:set_armor_groups({cracky=80,choppy=80,fleshy=80})
	self.object:set_hp(30)
	self.prev_y=self.object:getpos()
	if self.model == nil then
		self.model = minetest.env:add_entity(self.object:getpos(), "biplane:planeModel")
		self.model:set_attach(self.object, "", {x=0,y=-5,z=0}, {x=0,y=0,z=0})	
	end
end

function plane:on_punch(puncher, time_from_last_punch, tool_capabilities, direction)
	if self.object:get_hp() == 0 then
		if self.model ~= nil then
			self.model:remove()
		end
		if self.soundHandle then
			minetest.sound_stop(self.soundHandle)
		end
		self.object:remove()
		
		if puncher and puncher:is_player() then
			puncher:get_inventory():add_item("main", "default:steel_ingot 5")
			puncher:get_inventory():add_item("main", "default:mese_crystal")
		end
	end
end
function planeModel:on_punch(puncher, time_from_last_punch, tool_capabilities, direction)
	self.object:remove()
end
function plane:on_step(dtime)
	--Prevent multi plane control bug
	if self.driver and ( math.abs(self.driver:getpos().x-self.object:getpos().x)>10*dtime or math.abs(self.driver:getpos().y-self.object:getpos().y)>10*dtime or math.abs(self.driver:getpos().z-self.object:getpos().z)>10*dtime) then
		self.driver = nil
		self.model:set_animation({x=0,y=1},0, 0)
		minetest.sound_stop(self.soundHandle)
	end
	
	if self.driver then
		--self.driver:set_animation({ x= 81, y=160, },10,0)
		self.yaw = self.driver:get_look_yaw()
		local v = self.object:getvelocity()
		local ctrl = self.driver:get_player_control()
    local hor_speed = 0.5
		--Forward/backward
		if ctrl.jump then
      self.vx = self.vx + math.cos(self.driver:get_look_yaw())*0.001
			self.vz = self.vz + math.sin(self.driver:get_look_yaw())*0.001
      hor_speed = 0.01
		end
    if ctrl.up then
      self.vx = self.vx + math.cos(self.driver:get_look_yaw())*3
			self.vz = self.vz + math.sin(self.driver:get_look_yaw())*3
      hor_speed = 3
		end
    if not ctrl.down and not ctrl.up then
			self.vx = self.vx+math.cos(self.driver:get_look_yaw())*0.5
			self.vz = self.vz+math.sin(self.driver:get_look_yaw())*0.5
      hor_speed = 0.5
		end
		if ctrl.down then
			self.vx = self.vx+math.cos(self.driver:get_look_yaw())*0.1
			self.vz = self.vz+math.sin(self.driver:get_look_yaw())*0.1
      hor_speed = 0.1
		end
		--Left/right
		if ctrl.left then
			self.vz = self.vz+math.cos(self.driver:get_look_yaw())*0.1
			self.vx = self.vx+math.sin(math.pi+self.driver:get_look_yaw())*0.1
		end
		if ctrl.right then
			self.vz = self.vz-math.cos(self.driver:get_look_yaw())*0.1
			self.vx = self.vx-math.sin(math.pi+self.driver:get_look_yaw())*0.1
		end
		--Up/Down Lift Formula
    self.vy = math.sin(self.driver:get_look_pitch())*hor_speed
		--
	end
	if self.vx==0 and self.vz==0 and self.vy==0 then
		return
	end
	--Decelerating
	local sx=get_sign(self.vx)
	self.vx = self.vx - 0.02*sx
	local sz=get_sign(self.vz)
	self.vz = self.vz - 0.02*sz
	local sy=get_sign(self.vy)
	self.vy = self.vy-0.01*sy
	
	--Stop
	if sx ~= get_sign(self.vx) then
		self.vx = 0
	end
	if sz ~= get_sign(self.vz) then
		self.vz = 0
	end
	if sy ~= get_sign(self.vy) then
		self.vy = 0
	end
	
	--Speed limit
  if math.abs(self.vx) > 4.5 then
    self.vx = 4.5*get_sign(self.vx)
  end
  if math.abs(self.vz) > 10 then
    self.vz = 4.5*get_sign(self.vz)
  end
  if math.abs(self.vy) > 10 then
    self.vz = 4.5*get_sign(self.vy)
  end
 
	
	--Set speed to entity
	
	self.object:setvelocity({x=self.vx, y=self.vy,z=self.vz})
	if self.model then
		self.model:set_attach(self.object,"Root", {x=0,y=0,z=5}, {
			x=-90+self.vx*3*math.cos(self.yaw)+self.vz*3*math.sin(self.yaw), 
			y=0-self.vx*3*math.sin(self.yaw)+self.vz*3*math.cos(self.yaw), 
			z=(self.yaw-math.pi/2)*57})
	end
end

minetest.register_entity("biplane:plane", plane)
minetest.register_entity("biplane:planeModel", planeModel)
minetest.register_craftitem("biplane:plane", {
	description = "Plane",
	inventory_image = "biplane.png",
	wield_image = "biplane.png",
	wield_scale = {x=1, y=1, z=1},
	liquids_pointable = false,
	
	on_place = function(itemstack, placer, pointed_thing)
		if pointed_thing.type ~= "node" then
			return
		end
		if minetest.get_node(pointed_thing.above).name ~= "air" then
			return
		end
		minetest.env:add_entity(pointed_thing.above, "biplane:plane")
		itemstack:take_item()
		return itemstack
	end,
})
minetest.register_craftitem("biplane:wing", {
	description = "Wing",
	inventory_image = "wing.png",
})
minetest.register_craftitem("biplane:engine", {
	description = "Engine",
	inventory_image = "engine.png",
})
minetest.register_craftitem("biplane:wheel", {
	description = "Wheel",
	inventory_image = "wheel.png",
})
minetest.register_craftitem("biplane:rubber", {
	description = "Rubber",
	inventory_image = "rubber.png",
})
minetest.register_craftitem("biplane:seat", {
	description = "Airplane Middle",
	inventory_image = "seat.png",
})
minetest.register_craftitem("biplane:tail", {
	description = "Airplane Tail",
	inventory_image = "tail.png",
})
minetest.register_craftitem("biplane:controls", {
	description = "Airplane Controls",
	inventory_image = "stick.png",
})
minetest.register_craft({
	output = "biplane:plane",
	recipe = {
		{"", "", "biplane:wing"},
		{"biplane:tail", "biplane:seat", "biplane:engine"},
		{"", "biplane:wheel", "biplane:wing"}
	}
})
minetest.register_craft({
	output = "biplane:wing",
	recipe = {
		{"group:wood", "group:stick", "group:wood"},
	}
})
minetest.register_craft({
	output = "biplane:engine",
	recipe = {
		{"default:steel_ingot", "default:steel_ingot", "group:stick"},
		{"default:steel_ingot", "default:coalblock", "group:stick"},
		{"default:steel_ingot", "default:steel_ingot", "group:stick"}
	}
})
minetest.register_craft({
	output = "biplane:wheel",
	recipe = {
		{"", "biplane:rubber", ""},
		{"biplane:rubber", "default:steel_ingot", "biplane:rubber"},
		{"", "biplane:rubber", ""}
	}
})
minetest.register_craft({
	type = "cooking",
	output = "biplane:rubber",
	recipe = "group:tree",
})
minetest.register_craft({
	output = "biplane:seat",
	recipe = {
		{"group:wood", "", "biplane:controls"},
		{"group:wood", "", "group:wood"},
		{"group:wood", "group:wood", "group:wood"}
	}
})
minetest.register_craft({
	output = "biplane:tail",
	recipe = {
		{"group:wood", "", ""},
		{"group:wood", "group:wood", "group:wood"},
		{"", "biplane:wheel", ""}
	}
})
minetest.register_craft({
	output = "biplane:tail",
	recipe = {
		{"group:wood", "", ""},
		{"group:wood", "group:wood", "group:wood"},
		{"default:steelblock", "", ""}
	}
})
minetest.register_craft({
	output = "biplane:tail",
	recipe = {
		{"group:wood", "", ""},
		{"group:wood", "group:wood", "group:wood"},
		{"", "biplane:wheel", ""}
	}
})
minetest.register_craft({
	output = "biplane:controls",
	recipe = {
		{"", "group:stick", ""},
		{"group:stick", "group:stick", "group:stick"},
		{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
	}
})
A little, trick you can use... "make up a new email"
if you do not yet have an email using your user name here on this forum, then open up a new email acct like> ozkur@gmail.com, (or something) to use to open a new acct on github.

That would work out better anyway, as it will be easy to go back and forth with minetest stuff you create, with your username... and it won't interfere with any none/personal Minetest stuff
A Wonderful World

User avatar
TumeniNodes
Member
Posts: 2943
Joined: Fri Feb 26, 2016 19:49
GitHub: TumeniNodes
IRC: tumeninodes
In-game: TumeniNodes
Location: in the dark recesses of the mind
Contact:

Re: mod planes and minimap

by TumeniNodes » Post

ozkur wrote:i put it up in WIP mods!
ok, I'll take a look.
As long as my pc doesn't blow up or something when I open the zip we'll be ok :P
A Wonderful World

Post Reply

Who is online

Users browsing this forum: No registered users and 19 guests