From 85e5e97d60b5ae0c4f0b6e21b14d577f4ebd38d7 Mon Sep 17 00:00:00 2001 From: Zughy <4279489-marco_a@users.noreply.gitlab.com> Date: Fri, 30 Oct 2020 11:27:32 +0100 Subject: [PATCH] L'odio per Zaizen continua a crescere --- bl_arena_lib/arena_manager.lua | 13 +-- bl_modes/game_main.lua | 33 +++--- bl_weapons/bullets.lua | 2 +- bl_weapons/grenade.lua | 2 +- bl_weapons/pixelgun.lua | 2 +- bl_weapons/pixelgun_bullet.lua | 2 +- bl_weapons/rocket.lua | 2 +- bl_weapons/sample.lua | 6 +- bl_weapons/smg.lua | 2 +- bl_weapons/smg_bullet.lua | 2 +- bl_weapons/sword.lua | 2 +- bl_weapons/weapons.lua | 183 +++++++++++---------------------- player_manager.lua | 23 +---- 13 files changed, 98 insertions(+), 176 deletions(-) diff --git a/bl_arena_lib/arena_manager.lua b/bl_arena_lib/arena_manager.lua index 3accee2..f9aa806 100644 --- a/bl_arena_lib/arena_manager.lua +++ b/bl_arena_lib/arena_manager.lua @@ -13,6 +13,7 @@ arena_lib.on_load("block_league", function(arena) reset_meta(pl_name) equip_weapons(pl_name, arena) create_and_show_HUD(arena, pl_name) + block_league.refill_weapons(arena, pl_name) minetest.sound_play("bl_voice_countdown", {to_player = pl_name}) end @@ -44,6 +45,7 @@ arena_lib.on_join("block_league", function(p_name, arena) reset_meta(p_name) equip_weapons(p_name, arena) create_and_show_HUD(arena, p_name) + block_league.refill_weapons(arena, p_name) minetest.get_player_by_name(p_name):set_armor_groups({immortal = nil}) @@ -158,19 +160,12 @@ end function equip_weapons(p_name, arena) + --TODO avere una tabella per giocatore che tenga traccia delle armi equipaggiate + local default_weapons = {"block_league:smg", "block_league:sword", "block_league:pixelgun"} local inv = minetest.get_player_by_name(p_name):get_inventory() - -- TODO: ottenere armi in database giocatori, dato che potranno cambiarle - local default_weapons = {"block_league:smg", "block_league:sword", "block_league:pixelgun"} - for i, weapon_name in pairs(default_weapons) do - local magazine = minetest.registered_nodes[weapon_name].magazine - - if magazine then - arena.players[p_name].weapons_magazine[weapon_name] = magazine - end inv:add_item("main", ItemStack(weapon_name)) end - inv:add_item("main", ItemStack("block_league:bouncer")) end diff --git a/bl_modes/game_main.lua b/bl_modes/game_main.lua index eba5273..4c288cc 100644 --- a/bl_modes/game_main.lua +++ b/bl_modes/game_main.lua @@ -10,26 +10,15 @@ function block_league.round_start(arena) player:set_hp(20) arena.players[p_name].energy = 100 + block_league.refill_weapons(arena, p_name) + player:get_meta():set_int("bl_reloading", 0) + player:set_physics_override({ speed = vel, jump = 1.5 }) - player:get_meta():set_int("bl_reloading", 0) player:set_pos(arena_lib.get_random_spawner(arena, stats.teamID)) - - -- TEMP: da rimuovere quando giocatori avranno tabella armi - local default_weapons = {"block_league:smg", "block_league:sword", "block_league:pixelgun"} - - for i, weapon_name in pairs(default_weapons) do - local magazine = minetest.registered_nodes[weapon_name].magazine - - if magazine then - arena.players[p_name].weapons_magazine[weapon_name] = magazine - block_league.weapons_hud_update(arena, p_name, weapon_name, magazine) - end - end - end if arena.mod == 1 then @@ -41,6 +30,22 @@ end +function block_league.refill_weapons(arena, p_name) + --TODO avere una tabella per giocatore che tenga traccia delle armi equipaggiate + local default_weapons = {"block_league:smg", "block_league:sword", "block_league:pixelgun"} + + for i, weapon_name in pairs(default_weapons) do + local magazine = minetest.registered_nodes[weapon_name].magazine + + if magazine then + arena.players[p_name].weapons_magazine[weapon_name] = magazine + block_league.weapons_hud_update(arena, p_name, weapon_name, magazine) + end + end +end + + + ---------------------------------------------- diff --git a/bl_weapons/bullets.lua b/bl_weapons/bullets.lua index 6615b0e..4b8742f 100644 --- a/bl_weapons/bullets.lua +++ b/bl_weapons/bullets.lua @@ -10,7 +10,7 @@ tiles = def.tiles or nil, wield_image = def.wield_image or nil, - impaling = def.impaling, + pierce = def.pierce, knockback = def.knockback, decrease_damage_with_distance = def.decrease_damage_with_distance, bullet_damage = def.bullet_damage, diff --git a/bl_weapons/grenade.lua b/bl_weapons/grenade.lua index 7a702e9..731a2fe 100644 --- a/bl_weapons/grenade.lua +++ b/bl_weapons/grenade.lua @@ -5,7 +5,7 @@ block_league.register_bullet("block_league:grenade", { wield_scale = {x=1.5, y=1.5, z=1.5}, inventory_image = "bl_grenade_icon.png", stack_max = 99, - impaling = false, + pierce = false, throwable_by_hand = true, bullet_damage = 10, decrease_damage_with_distance = false, diff --git a/bl_weapons/pixelgun.lua b/bl_weapons/pixelgun.lua index 53fcdbb..12058a0 100644 --- a/bl_weapons/pixelgun.lua +++ b/bl_weapons/pixelgun.lua @@ -10,7 +10,7 @@ block_league.register_weapon("block_league:pixelgun", { weap_sound_shooting = "bl_pixelgun_shoot", consume_bullets = false, magazine = 4, - reload_delay = 4, + reload_time = 4, type = 1, weap_delay = 0.9, slow_down_when_firing = true, diff --git a/bl_weapons/pixelgun_bullet.lua b/bl_weapons/pixelgun_bullet.lua index 140fdd3..4295394 100644 --- a/bl_weapons/pixelgun_bullet.lua +++ b/bl_weapons/pixelgun_bullet.lua @@ -6,7 +6,7 @@ block_league.register_bullet("block_league:pixelgun_bullet", { inventory_image = "bl_grenade_icon.png", stack_max = 99, throwable_by_hand = false, - impaling = true, + pierce = true, knockback = 0, decrease_damage_with_distance = false, bullet_damage = 777, diff --git a/bl_weapons/rocket.lua b/bl_weapons/rocket.lua index d75d384..ab7aa85 100644 --- a/bl_weapons/rocket.lua +++ b/bl_weapons/rocket.lua @@ -8,7 +8,7 @@ block_league.register_bullet("block_league:rocket",{ bullet_damage = 10, throwable_by_hand = false, duration = 5, - impaling = false, + pierce = false, decrease_damage_with_distance = false, bullet_trail = { image = "bl_bullet_rocket.png", diff --git a/bl_weapons/sample.lua b/bl_weapons/sample.lua index f81ce57..d392f5a 100644 --- a/bl_weapons/sample.lua +++ b/bl_weapons/sample.lua @@ -22,7 +22,7 @@ block_league.register_weapon("block_league:nomearma", { slow_down_when_firing = true, --Se rallentare chi spara consume_bullets = true, --Se usa proiettili magazine = 0, --Dopo quanti colpi ricaricare - reload_delay = 5, + reload_time = 5, bullet = "block_league:nomeproiettile", --Che proiettile/granata spara aka quello che viene consumato all'uso on_right_click = function(arena, name, def, itemstack, user, pointed_thing) end, --Cosa fare quando si clicca destro @@ -31,7 +31,7 @@ block_league.register_weapon("block_league:nomearma", { slow_down_when_firing = true, --Se rallentare chi spara consume_bullets = true, --Se usa proiettili magazine = 0, --Dopo quanti colpi ricaricare - reload_delay = 5, + reload_time = 5, launching_force = 10, bullet = "block_league:nomeproiettile", --Che proiettile/granata spara on_right_click = function(arena, name, def, itemstack, user, pointed_thing) end, --Cosa fare quando si clicca destro @@ -61,7 +61,7 @@ block_league.register_bullet("block_league:nomeproiettile", { throwable_by_hand = true, --Se si può lanciare a mano consume_on_throw = true, - impaling = true, --Se può attraversare il bersaglio NB: Utilizzabile solo con proiettili hitscan + pierce = true, --Se può attraversare il bersaglio NB: Utilizzabile solo con proiettili hitscan knockback = 0, --Il contraccolpo da applicare al bersaglio decrease_damage_with_distance = true, --Se il danno diminuisce con la distanza bullet_damage = 10, --Danno inflitto diff --git a/bl_weapons/smg.lua b/bl_weapons/smg.lua index a64b47e..22c4e71 100644 --- a/bl_weapons/smg.lua +++ b/bl_weapons/smg.lua @@ -15,7 +15,7 @@ block_league.register_weapon("block_league:smg", { consume_bullets = false, magazine = 30, - reload_delay = 2, + reload_time = 2, range = 30, --Se non hitscan calcolarsi il tempo necessario per percorrere quello --spazio in base alla velocità diff --git a/bl_weapons/smg_bullet.lua b/bl_weapons/smg_bullet.lua index 768f278..45b3b5a 100644 --- a/bl_weapons/smg_bullet.lua +++ b/bl_weapons/smg_bullet.lua @@ -6,7 +6,7 @@ block_league.register_bullet("block_league:smg_bullet", { stack_max = 99, throwable_by_hand = false, - impaling = false, + pierce = false, knockback = 0, decrease_damage_with_distance = true, bullet_damage = 3, diff --git a/bl_weapons/sword.lua b/bl_weapons/sword.lua index 47a270d..12fc569 100644 --- a/bl_weapons/sword.lua +++ b/bl_weapons/sword.lua @@ -17,7 +17,7 @@ block_league.register_weapon("block_league:sword", { local dir = user:get_look_dir() local pos = user:get_pos() local pos_head = {x = pos.x, y = pos.y+1.475, z = pos.z} - local pointed_players = block_league.get_pointed_players(pos_head, dir, 0, 5, user, nil, true) + local pointed_players = block_league.get_pointed_players(pos_head, dir, 5, user, nil, true) dir.y = 0 diff --git a/bl_weapons/weapons.lua b/bl_weapons/weapons.lua index 895d954..7fbce10 100644 --- a/bl_weapons/weapons.lua +++ b/bl_weapons/weapons.lua @@ -1,4 +1,5 @@ local function get_dist() end +local function draw_particles() end local function weapon_reload() end local function weapon_right_click() end local function gestione_sparo() end @@ -142,7 +143,7 @@ function block_league.shoot_hitscan(name, def, bullet_definition, itemstack, use local dir = user:get_look_dir() local pos = user:get_pos() local pos_head = {x = pos.x, y = pos.y+1.475, z = pos.z} - local pointed_players = block_league.get_pointed_players(pos_head, dir, 0, def.range, user, bullet_definition.bullet_trail, bullet_definition.impaling) + local pointed_players = block_league.get_pointed_players(pos_head, dir, def.range, user, bullet_definition.bullet_trail, bullet_definition.pierce) if pointed_players then block_league.apply_damage(user, pointed_players, bullet_definition.bullet_damage, bullet_definition.knockback, bullet_definition.decrease_damage_with_distance) end @@ -182,12 +183,13 @@ end --- ritorna un array di player con il numero di player trovati a index 1. Se non --- trova player diversi da se stessi ritorna nil -function block_league.get_pointed_players(head_pos, dir, dist1, dist2, user, particle, trafigge) +-- ritorna un array di giocatori con il numero di giocatori trovati a indice 1. +-- Se non trova giocatori diversi da se stesso ritorna nil +function block_league.get_pointed_players(head_pos, dir, range, user, particle, has_piercing) + + local p1 = vector.add(head_pos, vector.multiply(dir, 0)) + local p2 = vector.add(head_pos, vector.multiply(dir, range)) - local p1 = vector.add(head_pos, vector.multiply(dir, dist1)) - local p2 = vector.add(head_pos, vector.multiply(dir, dist2)) local ray = minetest.raycast(p1, p2, true, false) local players = {} @@ -195,24 +197,22 @@ function block_league.get_pointed_players(head_pos, dir, dist1, dist2, user, par for hit in ray do -- se è un oggetto if hit.type == "object" then - if hit.ref then -- se è un giocatore - if hit.ref:is_player() then - -- e non è colui che spara - if hit.ref ~= user then - table.insert(players, hit.ref) - end - elseif hit.ref:get_luaentity() then - local entity = hit.ref:get_luaentity() - if entity.initial_properties ~= nil then + if hit.ref and hit.ref:is_player() then + -- e non è colui che spara + if hit.ref ~= user then + table.insert(players, hit.ref) + end + elseif hit.ref:get_luaentity() then + local entity = hit.ref:get_luaentity() + if entity.initial_properties ~= nil then - if entity.initial_properties.is_bullet or entity.initial_properties.is_grenade then - --distrugge sia il proiettile con cui collide che se stesso - entity.old_p_name = entity.p_name - entity.p_name = user:get_player_name() + if entity.initial_properties.is_bullet or entity.initial_properties.is_grenade then + --distrugge sia il proiettile con cui collide che se stesso + entity.old_p_name = entity.p_name + entity.p_name = user:get_player_name() - entity:_destroy() - end + entity:_destroy() end end end @@ -221,58 +221,19 @@ function block_league.get_pointed_players(head_pos, dir, dist1, dist2, user, par if hit.type == "node" then if #players > 0 then if particle ~= nil and particle ~= false then - if not trafigge then + if not has_piercing then local dist3 = get_dist(head_pos, players[1]:get_pos()) - minetest.add_particlespawner({ - amount = particle.amount, - time = 0.3, - minpos = p1, - maxpos = p1, - minvel = vector.multiply(dir, dist2), - maxvel = vector.multiply(dir, dist2), - minexptime = dist3/(dist2 * 1.5), - maxexptime = dist3/(dist2 * 1.5), - size = 2, - collisiondetection = false, - vertical = false, - texture = particle.image - }) + draw_particles(particle, dir, p1, range, dist3) else local dist3 = get_dist(head_pos, hit.intersection_point) - minetest.add_particlespawner({ - amount = particle.amount, - time = 0.3, - minpos = p1, - maxpos = p1, - minvel = vector.multiply(dir, dist2), - maxvel = vector.multiply(dir, dist2), - minexptime = dist3/(dist2 * 1.5), - maxexptime = dist3/(dist2 * 1.5), - size = 2, - collisiondetection = false, - vertical = false, - texture = particle.image - }) + draw_particles(particle, dir, p1, range, dist3) end end return players else if particle ~= nil and particle ~= false then local dist3 = get_dist(head_pos, hit.intersection_point) - minetest.add_particlespawner({ - amount = particle.amount, - time = 0.3, - minpos = p1, - maxpos = p1, - minvel = vector.multiply(dir, dist2), - maxvel = vector.multiply(dir, dist2), - minexptime = dist3/(dist2 * 1.5), - maxexptime = dist3/(dist2 * 1.5), - size = 2, - collisiondetection = false, - vertical = false, - texture = particle.image - }) + draw_particles(particle, dir, p1, range, dist3) end return nil end @@ -280,64 +241,21 @@ function block_league.get_pointed_players(head_pos, dir, dist1, dist2, user, par end end - -- se ho sparato a qualcuno puntando in aria (quindi senza incrociare blocchi) - if #players > 0 then - if trafigge then - if particle ~= nil and particle ~= false then - minetest.add_particlespawner({ - amount = particle.amount, - time = 0.3, - minpos = p1, - maxpos = p1, - minvel = vector.multiply(dir, 120), - maxvel = vector.multiply(dir, 120), - minexptime = dist2/120, - maxexptime = dist2/120, - size = 2, - collisiondetection = false, - vertical = false, - texture = particle.image - }) - end - return players - else - if particle ~= nil and particle ~= false then - - local dist3 = get_dist(head_pos, players[1]:get_pos()) - minetest.add_particlespawner({ - amount = particle.amount, - time = 0.3, - minpos = p1, - maxpos = p1, - minvel = vector.multiply(dir, dist2), - maxvel = vector.multiply(dir, dist2), - minexptime = dist3/(dist2 * 1.5), - maxexptime = dist3/(dist2 * 1.5), - size = 2, - collisiondetection = false, - vertical = false, - texture = particle.image - }) - - end - return {players[1]} - end - else + -- se ho sparato a qualcuno senza incrociare blocchi + if #players > 0 then if particle ~= nil and particle ~= false then - minetest.add_particlespawner({ - amount = particle.amount, - time = 0.3, - minpos = p1, - maxpos = p1, - minvel = vector.multiply(dir, 120), - maxvel = vector.multiply(dir, 120), - minexptime = dist2/120, - maxexptime = dist2/120, - size = 2, - collisiondetection = false, - vertical = false, - texture = particle.image - }) + if has_piercing then + draw_particles(particle, dir, p1, range, 120) + return players + else + local dist3 = get_dist(head_pos, players[1]:get_pos()) + draw_particles(particle, dir, p1, range, dist3) + return {players[1]} + end + end + else + if particle ~= nil and particle ~= false then + draw_particles(particle, dir, p1, range, 120) end return nil end @@ -425,6 +343,25 @@ end +function draw_particles(particle, dir, p1, dist2, dist3) + minetest.add_particlespawner({ + amount = particle.amount, + time = 0.3, + minpos = p1, + maxpos = p1, + minvel = vector.multiply(dir, dist2), + maxvel = vector.multiply(dir, dist2), + minexptime = dist3/(dist2 * 1.5), + maxexptime = dist3/(dist2 * 1.5), + size = 2, + collisiondetection = false, + vertical = false, + texture = particle.image + }) +end + + + function weapon_reload(user, def, name) local p_name = user:get_player_name() @@ -438,7 +375,7 @@ function weapon_reload(user, def, name) p_meta:set_int("bl_reloading", 1) - minetest.after(def.reload_delay, function() + minetest.after(def.reload_time, function() if not arena_lib.is_player_in_arena(p_name, "block_league") then return end p_meta:set_int("bl_weap_delay", 0) p_meta:set_int("bl_reloading", 0) @@ -538,7 +475,7 @@ function gestione_sparo(p_name, user, def, name) if arena.players[p_name].weapons_magazine[name] == 0 and user:get_meta():get_int("bl_reloading") == 0 then p_meta:set_int("bl_reloading", 1) - minetest.after(def.reload_delay, function() + minetest.after(def.reload_time, function() if user and user:get_meta() then p_meta:set_int("bl_weap_delay", 0) p_meta:set_int("bl_reloading", 0) diff --git a/player_manager.lua b/player_manager.lua index cfb564e..1d0af67 100644 --- a/player_manager.lua +++ b/player_manager.lua @@ -55,28 +55,13 @@ minetest.register_on_respawnplayer(function(player) if not arena_lib.is_player_in_arena(player:get_player_name(), "block_league") then return end - local pos = player:get_pos() - - death_delay(player, pos) + death_delay(player, player:get_pos()) player:set_physics_override({ speed = block_league.SPEED, jump = 1.5 }) - -- TEMP: da rimuovere quando giocatori avranno tabella armi - local p_name = player:get_player_name() - local arena = arena_lib.get_arena_by_player(p_name) - local default_weapons = {"block_league:smg", "block_league:sword", "block_league:pixelgun"} - - for i, weapon_name in pairs(default_weapons) do - local magazine = minetest.registered_nodes[weapon_name].magazine - - if magazine then - arena.players[p_name].weapons_magazine[weapon_name] = magazine - block_league.weapons_hud_update(arena, p_name, weapon_name, magazine) - end - end - + block_league.refill_weapons(arena, p_name) block_league.immunity(player) end) @@ -89,7 +74,7 @@ end) ---------------------------------------------- function death_delay(player, pos) - if player and player:get_meta() then + if player then local delay = player:get_meta():get_int("bl_death_delay") if delay == 1 and arena_lib.is_player_in_arena(player:get_player_name(), "block_league") then player:set_pos(pos) @@ -97,7 +82,7 @@ function death_delay(player, pos) return end end - minetest.after(0.1, function() death_delay(player, pos) end) + minetest.after(0.2, function() death_delay(player, pos) end) end