mirror of
				https://gitlab.com/echoes91/spears.git
				synced 2025-10-26 14:25:28 +01:00 
			
		
		
		
	Compare commits
	
		
			7 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b888cda310 | |||
| e2182ca004 | |||
| a5b33a6e9a | |||
| 8770387fbc | |||
| 66c69c5265 | |||
| 662e637595 | |||
|  | 63d339a686 | 
| @@ -4,3 +4,4 @@ DISABLE_COPPER_SPEAR = false | |||||||
| DISABLE_BRONZE_SPEAR = false | DISABLE_BRONZE_SPEAR = false | ||||||
| DISABLE_DIAMOND_SPEAR = false | DISABLE_DIAMOND_SPEAR = false | ||||||
| DISABLE_OBSIDIAN_SPEAR = false | DISABLE_OBSIDIAN_SPEAR = false | ||||||
|  | DISABLE_GOLD_SPEAR = false | ||||||
|   | |||||||
| @@ -1 +0,0 @@ | |||||||
| default |  | ||||||
							
								
								
									
										132
									
								
								functions.lua
									
									
									
									
									
								
							
							
						
						
									
										132
									
								
								functions.lua
									
									
									
									
									
								
							| @@ -23,12 +23,18 @@ function spears_throw (itemstack, player, pointed_thing) | |||||||
| 	while vector.distance(player_pos, throw_pos) < 1.2 do | 	while vector.distance(player_pos, throw_pos) < 1.2 do | ||||||
| 		throw_pos = vector.add(throw_pos, vector.multiply(direction, 0.1)) | 		throw_pos = vector.add(throw_pos, vector.multiply(direction, 0.1)) | ||||||
| 	end | 	end | ||||||
| 	local player_vel = player:get_player_velocity() | 	local player_vel | ||||||
|  | 	if player.is_fake_player then | ||||||
|  | 		player_vel = {x=0,y=0,z=0} | ||||||
|  | 	else | ||||||
|  | 		player_vel = player:get_velocity() | ||||||
|  | 	end | ||||||
| 	local spear_object = minetest.add_entity(throw_pos, spear) | 	local spear_object = minetest.add_entity(throw_pos, spear) | ||||||
| 	spear_object:set_velocity(vector.add(player_vel, vector.multiply(direction, throw_speed))) | 	spear_object:set_velocity(vector.add(player_vel, vector.multiply(direction, throw_speed))) | ||||||
| 	spear_object:set_rotation(rotation) | 	spear_object:set_rotation(rotation) | ||||||
| 	minetest.sound_play("spears_throw", {pos = player_pos}, true) | 	minetest.sound_play("spears_throw", {pos = player_pos}, true) | ||||||
| 	spear_object:get_luaentity()._wear = itemstack:get_wear() | 	spear_object:get_luaentity()._wear = itemstack:get_wear() | ||||||
|  | 	spear_object:get_luaentity().lastpos = throw_pos | ||||||
| 	spear_object:get_luaentity()._stickpos = nil | 	spear_object:get_luaentity()._stickpos = nil | ||||||
| 	return true | 	return true | ||||||
| end | end | ||||||
| @@ -41,6 +47,7 @@ function spears_set_entity(spear_type, base_damage, toughness) | |||||||
| 			visual_size = {x = 0.3, y = 0.3, z = 0.3}, | 			visual_size = {x = 0.3, y = 0.3, z = 0.3}, | ||||||
| 			wield_item = "spears:spear_" .. spear_type, | 			wield_item = "spears:spear_" .. spear_type, | ||||||
| 			collisionbox = {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3}, | 			collisionbox = {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3}, | ||||||
|  | 			lastpos={}, | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
| 		on_activate = function (self, staticdata, dtime_s) | 		on_activate = function (self, staticdata, dtime_s) | ||||||
| @@ -69,61 +76,106 @@ function spears_set_entity(spear_type, base_damage, toughness) | |||||||
| 			if self._stickpos then | 			if self._stickpos then | ||||||
| 				local node = minetest.get_node(self._stickpos) | 				local node = minetest.get_node(self._stickpos) | ||||||
| 				local node_cracky = minetest.registered_nodes[node.name].groups.cracky | 				local node_cracky = minetest.registered_nodes[node.name].groups.cracky | ||||||
|  | 				local pos = self.object:get_pos() | ||||||
| 				if node_cracky and node_cracky < 3 then | 				if node_cracky and node_cracky < 3 then | ||||||
| 					minetest.sound_play("default_metal_footstep", {pos = pos}, true) | 					minetest.sound_play("default_metal_footstep", {pos = pos}, true) | ||||||
| 					self.object:remove() | 					self.object:remove() | ||||||
| 					minetest.add_item(self.object:get_pos(), {name='spears:spear_' .. spear_type, wear = self._wear}) | 					minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = self._wear}) | ||||||
| 				elseif not self._node_walkable then | 				elseif not self._node_walkable then | ||||||
| 					minetest.sound_play("default_place_node", {pos = throw_pos}, true) | 					minetest.sound_play("default_place_node", {pos = self._stickpos}, true) | ||||||
| 				end | 				end | ||||||
| 				self._node_walkable = minetest.registered_nodes[node.name].walkable			 | 				self._node_walkable = minetest.registered_nodes[node.name].walkable			 | ||||||
| 				if not node or not self._node_walkable then -- Fall when node is removed | 				if not node or not self._node_walkable then -- Fall when node is removed | ||||||
| 					self.object:remove() | 					self.object:remove() | ||||||
| 					minetest.add_item(self.object:get_pos(), {name='spears:spear_' .. spear_type, wear = self._wear}) | 					minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = self._wear}) | ||||||
| 					return | 					return | ||||||
| 				end | 				end | ||||||
| 			else -- Spear is flying | 			else -- Spear is flying | ||||||
| 				local direction = vector.normalize(velocity) | 				local newpos = self.object:get_pos() | ||||||
| 				local yaw = minetest.dir_to_yaw(direction) | 				for _, pos in pairs(spears_get_trajectoire(self, newpos)) do | ||||||
| 				local pitch = math.acos(velocity.y/speed) - math.pi/3 | 					local direction = vector.normalize(velocity) | ||||||
| 				local pos = self.object:get_pos() | 					local yaw = minetest.dir_to_yaw(direction) | ||||||
| 				local spearhead_pos = vector.add(pos, vector.multiply(direction, 0.5)) | 					local pitch = math.acos(velocity.y/speed) - math.pi/3 | ||||||
| 				local node = minetest.get_node(spearhead_pos) | 					local spearhead_pos = vector.add(pos, vector.multiply(direction, 0.5)) | ||||||
| 				self.object:set_rotation({x = 0, y = yaw + math.pi/2, z = pitch}) | 					local node = minetest.get_node(spearhead_pos) | ||||||
| 				-- Hit someone? | 					self.object:set_rotation({x = 0, y = yaw + math.pi/2, z = pitch}) | ||||||
| 				local objects_in_radius = minetest.get_objects_inside_radius(spearhead_pos, 0.6) | 					-- Hit someone? | ||||||
| 				for _,object in ipairs(objects_in_radius) do | 					local objects_in_radius = minetest.get_objects_inside_radius(spearhead_pos, 2.5) | ||||||
| 					if object:get_luaentity() ~= self and object:get_armor_groups().fleshy then | 					for _,object in ipairs(objects_in_radius) do | ||||||
| 						local damage = (speed + base_damage)^1.15 - 20 | 						if object:get_luaentity() ~= self and object:get_armor_groups().fleshy then | ||||||
| 						object:punch(self.object, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy=damage},}, direction) | 							local objpos = object:get_pos() | ||||||
| 						self.object:remove() | 							local collisionbox = object:get_properties().collisionbox or {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5} | ||||||
| 						minetest.sound_play("spears_hit", {pos = pos}, true) | 							if spears_touch(spearhead_pos, objpos, collisionbox) then | ||||||
| 						minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = self._wear + 65535/toughness}) | 								local damage = (speed + base_damage)^1.15 - 20 | ||||||
|  | 								object:punch(self.object, 1.0, {full_punch_interval = 1.0, damage_groups = {fleshy=damage},}, direction) | ||||||
|  | 								self.object:remove() | ||||||
|  | 								minetest.sound_play("spears_hit", {pos = pos}, true) | ||||||
|  | 								minetest.add_item(pos, {name='spears:spear_' .. spear_type, wear = self._wear + 65535/toughness}) | ||||||
|  | 								return | ||||||
|  | 							end | ||||||
|  | 						end | ||||||
|  | 					end | ||||||
|  | 					-- Hit a node?	 | ||||||
|  | 					if node and minetest.registered_nodes[node.name].walkable | ||||||
|  | 					and not minetest.registered_nodes[node.name].buildable_to | ||||||
|  | 					and not (minetest.registered_nodes[node.name].groups.slab and spearhead_pos.y % 1 < 0.5) | ||||||
|  | 					then -- Stick | ||||||
|  | 						self.object:set_acceleration({x = 0, y = 0, z = 0}) | ||||||
|  | 						self.object:set_velocity({x = 0, y = 0, z = 0}) | ||||||
|  | 						self._wear = self._wear + 65535/toughness | ||||||
|  | 						if self._wear >= 65535 then | ||||||
|  | 							minetest.sound_play("default_tool_breaks", {pos = pos}, true) | ||||||
|  | 							self.object:remove() | ||||||
|  | 							return | ||||||
|  | 						end | ||||||
|  | 						self._stickpos = spearhead_pos | ||||||
|  | 						self.lastpos = pos | ||||||
| 						return | 						return | ||||||
|  | 					else  -- Get drag | ||||||
|  | 						local drag = math.max(minetest.registered_nodes[node.name].liquid_viscosity, 0.1) | ||||||
|  | 						local acceleration = vector.multiply(velocity, -drag) | ||||||
|  | 						acceleration.y = acceleration.y - 10 * ((7 - drag) / 7) | ||||||
|  | 						self.object:set_acceleration(acceleration) | ||||||
| 					end | 					end | ||||||
| 				end | 				end | ||||||
| 				-- Hit a node?	 | 				self.lastpos = newpos | ||||||
| 				if node and minetest.registered_nodes[node.name].walkable |  | ||||||
| 				and not minetest.registered_nodes[node.name].buildable_to |  | ||||||
| 				and not (minetest.registered_nodes[node.name].groups.slab and spearhead_pos.y % 1 < 0.5) |  | ||||||
| 				then -- Stick |  | ||||||
| 					self.object:set_acceleration({x = 0, y = 0, z = 0}) |  | ||||||
| 					self.object:set_velocity({x = 0, y = 0, z = 0}) |  | ||||||
| 					self._wear = self._wear + 65535/toughness |  | ||||||
| 					if self._wear >= 65535 then |  | ||||||
| 						minetest.sound_play("default_tool_breaks", {pos = pos}, true) |  | ||||||
| 						self.object:remove() |  | ||||||
| 						return |  | ||||||
| 					end |  | ||||||
| 					self._stickpos = spearhead_pos |  | ||||||
| 				else  -- Get drag |  | ||||||
| 					local drag = math.max(minetest.registered_nodes[node.name].liquid_viscosity, 0.1) |  | ||||||
| 					local acceleration = vector.multiply(velocity, -drag) |  | ||||||
| 					acceleration.y = acceleration.y - 10 * ((7 - drag) / 7) |  | ||||||
| 					self.object:set_acceleration(acceleration) |  | ||||||
| 				end |  | ||||||
| 			end | 			end | ||||||
| 		end, | 		end, | ||||||
| 	} | 	} | ||||||
| 	return SPEAR_ENTITY | 	return SPEAR_ENTITY | ||||||
| end | end | ||||||
|  |  | ||||||
|  |  | ||||||
|  | function spears_get_trajectoire(self, newpos) | ||||||
|  | 	if self.lastpos.x == nil then | ||||||
|  | 		return {newpos} | ||||||
|  | 	end | ||||||
|  | 	local coord = {} | ||||||
|  | 	local dx = vector.distance({x=newpos["x"], y=0, z=0}, {x=self.lastpos["x"], y=0, z=0} )/2 | ||||||
|  | 	local dy = vector.distance({x=0, y=newpos["y"], z=0}, {x=0, y=self.lastpos["y"], z=0} )/2 | ||||||
|  | 	local dz = vector.distance({x=0, y=0, z=newpos["z"]}, {x=0, y=0, z=self.lastpos["z"]} )/2 | ||||||
|  |  | ||||||
|  | 	if newpos["x"] < self.lastpos["x"] then | ||||||
|  | 		dx = -dx | ||||||
|  | 	end | ||||||
|  | 	if newpos["y"] < self.lastpos["y"] then | ||||||
|  | 		dy = -dy | ||||||
|  | 	end | ||||||
|  | 	if newpos["z"] < self.lastpos["z"] then | ||||||
|  | 		dz = -dz | ||||||
|  | 	end | ||||||
|  | 	table.insert(coord, {x=self.lastpos["x"]+dx, y=self.lastpos["y"]+dy ,z=self.lastpos["z"]+dz }) | ||||||
|  | 	table.insert(coord, newpos) | ||||||
|  | 	return coord | ||||||
|  | end | ||||||
|  |  | ||||||
|  |  | ||||||
|  | function spears_touch(pos, objpos, cbox) | ||||||
|  | 	--colbox format {x1, y1, z1, x2, y2, z2} | ||||||
|  | 	if (pos.x < objpos.x + math.max(cbox[1], cbox[4]) and pos.x > objpos.x + math.min(cbox[1], cbox[4]))  | ||||||
|  | 		and (pos.y < objpos.y + math.max(cbox[2], cbox[5]) and pos.y > objpos.y + math.min(cbox[2], cbox[5]))  | ||||||
|  | 		and (pos.z < objpos.z + math.max(cbox[3], cbox[6]) and pos.z > objpos.z + math.min(cbox[3], cbox[6])) then | ||||||
|  | 		return true | ||||||
|  | 	end | ||||||
|  | 	return false | ||||||
|  | end | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								init.lua
									
									
									
									
									
								
							| @@ -12,6 +12,4 @@ dofile(minetest.get_modpath("spears").."/functions.lua") | |||||||
| dofile(minetest.get_modpath("spears").."/tools.lua") | dofile(minetest.get_modpath("spears").."/tools.lua") | ||||||
|  |  | ||||||
|  |  | ||||||
| if minetest.setting_get("log_mods") then | minetest.log("action", "[spears] loaded.") | ||||||
| 	minetest.log("action", "spears loaded") |  | ||||||
| end |  | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								locale/spears.fr.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								locale/spears.fr.tr
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | |||||||
|  | # textdomain: spears | ||||||
|  |  | ||||||
|  | Stone spear=Lance en pierre | ||||||
|  | Steel spear=Lance en acier | ||||||
|  | Copper spear=Lance en cuivre | ||||||
|  | Bronze spear=Lance en bronze | ||||||
|  | Obsidian spear=Lance en obsidienne | ||||||
|  | Diamond spear=Lance en diamant | ||||||
|  | Golden spear=Lance en or | ||||||
							
								
								
									
										11
									
								
								locale/template.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								locale/template.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | # textdomain: spears | ||||||
|  |  | ||||||
|  | Stone spear= | ||||||
|  | Steel spear= | ||||||
|  | Copper spear= | ||||||
|  | Bronze spear= | ||||||
|  | Obsidian spear=  | ||||||
|  | Diamond spear= | ||||||
|  | Golden spear= | ||||||
|  |   | ||||||
|  |   | ||||||
							
								
								
									
										4
									
								
								mod.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								mod.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | name = spears | ||||||
|  | title = Separs | ||||||
|  | description = Add spears to Minetest | ||||||
|  | depends = default | ||||||
							
								
								
									
										24
									
								
								tools.lua
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								tools.lua
									
									
									
									
									
								
							| @@ -1,20 +1,30 @@ | |||||||
|  |  | ||||||
|  | local S = minetest.get_translator("spears") | ||||||
|  |  | ||||||
| function spears_register_spear(spear_type, desc, base_damage, toughness, material) | function spears_register_spear(spear_type, desc, base_damage, toughness, material) | ||||||
|  |  | ||||||
| 	minetest.register_tool("spears:spear_" .. spear_type, { | 	minetest.register_tool("spears:spear_" .. spear_type, { | ||||||
| 		description = desc .. " spear", | 		description = S(desc .. " spear"), | ||||||
|                 wield_image = "spears_spear_" .. spear_type .. ".png^[transform4", |                 wield_image = "spears_spear_" .. spear_type .. ".png^[transform4", | ||||||
| 		inventory_image = "spears_spear_" .. spear_type .. ".png", | 		inventory_image = "spears_spear_" .. spear_type .. ".png", | ||||||
| 		wield_scale= {x = 1.5, y = 1.5, z = 1.5}, | 		wield_scale= {x = 1.5, y = 1.5, z = 1.5}, | ||||||
| 		on_secondary_use = function(itemstack, user, pointed_thing) | 		on_secondary_use = function(itemstack, user, pointed_thing) | ||||||
| 			spears_throw(itemstack, user, pointed_thing) | 			spears_throw(itemstack, user, pointed_thing) | ||||||
| 			if not minetest.setting_getbool("creative_mode") then | 			if not minetest.settings:get_bool("creative_mode") then | ||||||
| 				itemstack:take_item() | 				itemstack:take_item() | ||||||
| 			end | 			end | ||||||
| 			return itemstack | 			return itemstack | ||||||
| 		end, | 		end, | ||||||
| 		on_place = function(itemstack, user, pointed_thing) | 		on_place = function(itemstack, user, pointed_thing) | ||||||
|  | 			if pointed_thing.type == "node" then | ||||||
|  | 				local node = minetest.get_node(pointed_thing.under) | ||||||
|  | 				if minetest.registered_nodes[node.name] and (node.name == "itemframes:pedestal" or node.name == "itemframes:frame") then | ||||||
|  | 				    minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) | ||||||
|  | 				    return itemstack | ||||||
|  | 				end | ||||||
|  | 			end | ||||||
| 			spears_throw(itemstack, user, pointed_thing) | 			spears_throw(itemstack, user, pointed_thing) | ||||||
| 			if not minetest.setting_getbool("creative_mode") then | 			if not minetest.settings:get_bool("creative_mode") then | ||||||
| 				itemstack:take_item() | 				itemstack:take_item() | ||||||
| 			end | 			end | ||||||
| 			return itemstack | 			return itemstack | ||||||
| @@ -38,14 +48,18 @@ function spears_register_spear(spear_type, desc, base_damage, toughness, materia | |||||||
| 	minetest.register_craft({ | 	minetest.register_craft({ | ||||||
| 		output = 'spears:spear_' .. spear_type, | 		output = 'spears:spear_' .. spear_type, | ||||||
| 		recipe = { | 		recipe = { | ||||||
| 			{'group:stick', 'group:stick', material}, | 			{'', '', material}, | ||||||
|  | 			{'', 'group:stick', ''}, | ||||||
|  | 			{'group:stick', '', ''}, | ||||||
| 		} | 		} | ||||||
| 	}) | 	}) | ||||||
| 	 | 	 | ||||||
| 	minetest.register_craft({ | 	minetest.register_craft({ | ||||||
| 		output = 'spears:spear_' .. spear_type, | 		output = 'spears:spear_' .. spear_type, | ||||||
| 		recipe = { | 		recipe = { | ||||||
| 			{material, 'group:stick', 'group:stick'}, | 			{material, '', ''}, | ||||||
|  | 			{'', 'group:stick', ''}, | ||||||
|  | 			{'', '', 'group:stick'}, | ||||||
| 		} | 		} | ||||||
| 	}) | 	}) | ||||||
| end | end | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user