From 379665634083ce475516fa87906f92e2d5fa83bd Mon Sep 17 00:00:00 2001 From: coiax Date: Wed, 6 Jul 2016 12:53:30 +0100 Subject: [PATCH] Adds ammo drops to CTF, fixes reload bug (#19125) * My bed broke * Slow healing, nodrop items * Mark arena as dirty when stopping ctf * Fixes spooky zombie projectile bug --- .../game/objects/items/weapons/tanks/tanks.dm | 4 +- code/modules/admin/verbs/debug.dm | 1 - code/modules/awaymissions/capture_the_flag.dm | 139 ++++++++++++++++-- code/modules/mob/living/carbon/human/death.dm | 3 +- .../simple_animal/hostile/mining_mobs.dm | 6 +- code/modules/projectiles/ammunition.dm | 4 +- code/modules/projectiles/gun.dm | 1 - .../projectiles/guns/projectile/automatic.dm | 3 +- code/modules/projectiles/projectile.dm | 4 +- 9 files changed, 138 insertions(+), 27 deletions(-) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 843d8753379..b65525eb552 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -60,7 +60,7 @@ qdel(air_contents) STOP_PROCESSING(SSobj, src) - return ..() + . = ..() /obj/item/weapon/tank/examine(mob/user) var/obj/icon = src @@ -127,7 +127,7 @@ else if(istype(W, /obj/item/device/assembly_holder)) bomb_assemble(W,user) else - return ..() + . = ..() /obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ datum/tgui/master_ui = null, datum/ui_state/state = hands_state) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index fd6ada6a51d..1961a8ceb27 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -573,7 +573,6 @@ var/global/list/g_fancy_list_of_types = null if(!ishuman(M)) alert("Invalid mob") return - //log_admin("[key_name(src)] has alienized [M.key].") var/list/outfits = list("Naked","Custom","As Job...") diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 75e0c079b37..e6cb0ad5723 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -4,6 +4,7 @@ #define FLAG_RETURN_TIME 200 // 20 seconds #define INSTAGIB_RESPAWN 50 //5 seconds #define DEFAULT_RESPAWN 150 //15 seconds +#define AMMO_DROP_LIFETIME 300 @@ -131,6 +132,8 @@ var/control_points = 0 var/control_points_to_win = 180 var/list/team_members = list() + var/list/spawned_mobs = list() + var/list/recently_dead_ckeys = list() var/ctf_enabled = FALSE var/ctf_gear = /datum/outfit/ctf var/instagib_gear = /datum/outfit/ctf/instagib @@ -157,6 +160,21 @@ poi_list.Remove(src) ..() +/obj/machinery/capture_the_flag/process() + for(var/i in spawned_mobs) + if(!i) + spawned_mobs -= i + continue + // Anyone in crit, automatically reap + var/mob/living/M = i + if(M.InCritical() || M.stat == DEAD) + ctf_dust_old(M) + else + // The changes that you've been hit with no shield but not + // instantly critted are low, but have some healing. + M.adjustBruteLoss(-1) + M.adjustFireLoss(-1) + /obj/machinery/capture_the_flag/red name = "Red CTF Controller" icon_state = "syndbeacon" @@ -177,11 +195,12 @@ if(ticker.current_state != GAME_STATE_PLAYING) return if(user.ckey in team_members) - if(user.mind.current && user.mind.current.timeofdeath + respawn_cooldown > world.time) + if(user.ckey in recently_dead_ckeys) user << "It must be more than [respawn_cooldown/10] seconds from your last death to respawn!" return var/client/new_team_member = user.client - dust_old(user) + if(user.mind && user.mind.current) + ctf_dust_old(user.mind.current) spawn_team_member(new_team_member) return @@ -196,15 +215,20 @@ return team_members |= user.ckey var/client/new_team_member = user.client - dust_old(user) + if(user.mind && user.mind.current) + ctf_dust_old(user.mind.current) spawn_team_member(new_team_member) -/obj/machinery/capture_the_flag/proc/dust_old(mob/user) - if(user.mind && user.mind.current && user.mind.current.z == src.z) - new /obj/item/ammo_box/magazine/recharge/ctf (get_turf(user.mind.current)) - new /obj/item/ammo_box/magazine/recharge/ctf (get_turf(user.mind.current)) - user.mind.current.dust() +/obj/machinery/capture_the_flag/proc/ctf_dust_old(mob/living/body) + if(isliving(body) && body.z == src.z) + var/turf/T = get_turf(body) + new /obj/effect/ctf/ammo(T) + recently_dead_ckeys += body.ckey + addtimer(src, "clear_cooldown", respawn_cooldown, TRUE, body.ckey) + body.dust() +/obj/machinery/capture_the_flag/proc/clear_cooldown(var/ckey) + recently_dead_ckeys -= ckey /obj/machinery/capture_the_flag/proc/spawn_team_member(client/new_team_member) var/mob/living/carbon/human/M = new/mob/living/carbon/human(get_turf(src)) @@ -212,6 +236,7 @@ M.key = new_team_member.key M.faction += team M.equipOutfit(ctf_gear) + spawned_mobs += M /obj/machinery/capture_the_flag/Topic(href, href_list) if(href_list["join"]) @@ -281,12 +306,15 @@ /obj/machinery/capture_the_flag/proc/stop_ctf() ctf_enabled = FALSE + arena_cleared = FALSE var/area/A = get_area(src) for(var/i in mob_list) var/mob/M = i if((get_area(A) == A) && (M.ckey in team_members)) M.dust() team_members.Cut() + spawned_mobs.Cut() + recently_dead_ckeys.Cut() /obj/machinery/capture_the_flag/proc/instagib_mode() for(var/obj/machinery/capture_the_flag/CTF in machines) @@ -300,23 +328,43 @@ CTF.ctf_gear = initial(ctf_gear) CTF.respawn_cooldown = DEFAULT_RESPAWN -/obj/item/weapon/gun/projectile/automatic/pistol/deagle/CTF +/obj/item/weapon/gun/projectile/automatic/pistol/deagle/ctf desc = "This looks like it could really hurt in melee." force = 75 +/obj/item/weapon/gun/projectile/automatic/pistol/deagle/ctf/dropped() + . = ..() + addtimer(src, "floor_vanish", 1) + +/obj/item/weapon/gun/projectile/automatic/pistol/deagle/ctf/proc/floor_vanish() + if(isturf(loc)) + qdel(src) + /obj/item/weapon/gun/projectile/automatic/laser/ctf mag_type = /obj/item/ammo_box/magazine/recharge/ctf desc = "This looks like it could really hurt in melee." force = 50 + flags = NODROP | DROPDEL /obj/item/ammo_box/magazine/recharge/ctf ammo_type = /obj/item/ammo_casing/caseless/laser/ctf +/obj/item/ammo_box/magazine/recharge/ctf/dropped() + . = ..() + addtimer(src, "floor_vanish", 1) + +/obj/item/ammo_box/magazine/recharge/ctf/proc/floor_vanish() + if(isturf(loc)) + qdel(src) + /obj/item/ammo_casing/caseless/laser/ctf projectile_type = /obj/item/projectile/beam/ctf /obj/item/projectile/beam/ctf damage = 150 + icon_state = "omnilaser" + +// RED TEAM GUNS /obj/item/weapon/gun/projectile/automatic/laser/ctf/red mag_type = /obj/item/ammo_box/magazine/recharge/ctf/red @@ -330,6 +378,8 @@ /obj/item/projectile/beam/ctf/red icon_state = "laser" +// BLUE TEAM GUNS + /obj/item/weapon/gun/projectile/automatic/laser/ctf/blue mag_type = /obj/item/ammo_box/magazine/recharge/ctf/blue @@ -344,17 +394,35 @@ /datum/outfit/ctf name = "CTF" - /obj/item/device/radio/headset + ears = /obj/item/device/radio/headset uniform = /obj/item/clothing/under/syndicate suit = /obj/item/clothing/suit/space/hardsuit/shielded/ctf shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/combat id = /obj/item/weapon/card/id/syndicate - belt = /obj/item/weapon/gun/projectile/automatic/pistol/deagle/CTF + belt = /obj/item/weapon/gun/projectile/automatic/pistol/deagle/ctf l_pocket = /obj/item/ammo_box/magazine/recharge/ctf r_pocket = /obj/item/ammo_box/magazine/recharge/ctf r_hand = /obj/item/weapon/gun/projectile/automatic/laser/ctf +/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE) + if(visualsOnly) + return + var/list/no_drops = list() + var/obj/item/weapon/card/id/W = H.wear_id + no_drops += W + W.registered_name = H.real_name + W.update_label(W.registered_name, W.assignment) + + // The shielded hardsuit is already NODROP + no_drops += H.get_item_by_slot(slot_gloves) + no_drops += H.get_item_by_slot(slot_shoes) + no_drops += H.get_item_by_slot(slot_w_uniform) + no_drops += H.get_item_by_slot(slot_ears) + for(var/i in no_drops) + var/obj/item/I = i + I.flags |= NODROP + /datum/outfit/ctf/instagib r_hand = /obj/item/weapon/gun/energy/laser/instakill shoes = /obj/item/clothing/shoes/jackboots/fast @@ -363,6 +431,8 @@ ears = /obj/item/device/radio/headset/syndicate/alt suit = /obj/item/clothing/suit/space/hardsuit/shielded/ctf/red r_hand = /obj/item/weapon/gun/projectile/automatic/laser/ctf/red + l_pocket = /obj/item/ammo_box/magazine/recharge/ctf/red + r_pocket = /obj/item/ammo_box/magazine/recharge/ctf/red /datum/outfit/ctf/red/instagib r_hand = /obj/item/weapon/gun/energy/laser/instakill/red @@ -372,17 +442,21 @@ ears = /obj/item/device/radio/headset/headset_cent/commander suit = /obj/item/clothing/suit/space/hardsuit/shielded/ctf/blue r_hand = /obj/item/weapon/gun/projectile/automatic/laser/ctf/blue + l_pocket = /obj/item/ammo_box/magazine/recharge/ctf/blue + r_pocket = /obj/item/ammo_box/magazine/recharge/ctf/blue /datum/outfit/ctf/blue/instagib r_hand = /obj/item/weapon/gun/energy/laser/instakill/blue shoes = /obj/item/clothing/shoes/jackboots/fast /datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H) + ..() var/obj/item/device/radio/R = H.ears R.set_frequency(SYND_FREQ) R.freqlock = 1 /datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H) + ..() var/obj/item/device/radio/R = H.ears R.set_frequency(CENTCOM_FREQ) R.freqlock = 1 @@ -406,7 +480,7 @@ /obj/structure/divine/trap/ctf/trap_effect(mob/living/L) if(!(src.team in L.faction)) L << "Stay out of the enemy spawn!" - L.dust() + L.death() /obj/structure/divine/trap/ctf/red @@ -430,7 +504,48 @@ invisibility = INVISIBILITY_OBSERVER alpha = 100 +/obj/effect/ctf/ammo + name = "ammo pickup" + desc = "You like revenge, right? Everybody likes revenge! Well, \ + let's go get some!" + icon = 'icons/effects/effects.dmi' + icon_state = "at_shield1" + layer = ABOVE_MOB_LAYER + alpha = 255 + invisibility = 0 + +/obj/effect/ctf/ammo/New() + ..() + QDEL_IN(src, AMMO_DROP_LIFETIME) + +/obj/effect/ctf/ammo/Crossed(atom/movable/AM) + reload(AM) + +/obj/effect/ctf/ammo/Bump(atom/movable/AM) + reload(AM) + +/obj/effect/ctf/ammo/Bumped(atom/movable/AM) + reload(AM) + +/obj/effect/ctf/ammo/proc/reload(mob/living/M) + if(!ishuman(M)) + return + for(var/obj/machinery/capture_the_flag/CTF in machines) + if(M in CTF.spawned_mobs) + var/outfit = CTF.ctf_gear + var/datum/outfit/O = new outfit + for(var/obj/item/weapon/gun/G in M) + M.unEquip(G) + qdel(G) + O.equip(M) + M << "Ammunition reloaded!" + playsound(get_turf(M), 'sound/weapons/shotgunpump.ogg', 50, 1, -1) + qdel(src) + break + /obj/effect/ctf/dead_barricade + name = "dead barrier" + desc = "It provided cover in fire fights. And now it's gone." icon = 'icons/obj/objects.dmi' icon_state = "barrier0" diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index d7ae6b29528..d1b085ca3b9 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -33,8 +33,7 @@ ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now . = ..(gibbed) if(mind && mind.devilinfo) - spawn(0) - mind.devilinfo.beginResurrectionCheck(src) + addtimer(mind.devilinfo, "beginResurrectionCheck", 0, FALSE, src) /mob/living/carbon/human/proc/makeSkeleton() status_flags |= DISFIGURED diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index ac2f797396b..bbfb9c772b9 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -264,7 +264,7 @@ else feedback_add_details("hivelord_core", "[type]|stabilizer") - + /obj/item/organ/hivelord_core/proc/go_inert() inert = TRUE desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested." @@ -454,7 +454,7 @@ mob_size = MOB_SIZE_LARGE var/pre_attack = 0 var/pre_attack_icon = "Goliath_preattack" - loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = ABOVE_MOB_LAYER}) + loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) /mob/living/simple_animal/hostile/asteroid/goliath/Life() ..() @@ -486,7 +486,6 @@ ranged_cooldown = world.time + ranged_cooldown_time icon_state = icon_aggro pre_attack = 0 - return /mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(damage) ranged_cooldown -= 10 @@ -498,7 +497,6 @@ handle_preattack() if(icon_state != icon_aggro) icon_state = icon_aggro - return /obj/effect/goliath_tentacle/ name = "Goliath tentacle" diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 5beb6a7ed7a..ff698c1c2dc 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -32,9 +32,8 @@ desc = "[initial(desc)][BB ? "" : " This one is spent"]" /obj/item/ammo_casing/proc/newshot() //For energy weapons, shotgun shells and wands (!). - if (!BB) + if(!BB) BB = new projectile_type(src) - return /obj/item/ammo_casing/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/ammo_box)) @@ -79,6 +78,7 @@ var/multiload = 1 /obj/item/ammo_box/New() + ..() for(var/i = 1, i <= max_ammo, i++) stored_ammo += new ammo_type(src) update_icon() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index a9f383c0ca7..079b00aa0c5 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -107,7 +107,6 @@ /obj/item/weapon/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) user << "*click*" playsound(user, 'sound/weapons/empty.ogg', 100, 1) - return /obj/item/weapon/gun/proc/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1) diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 994958670ba..988b0ebd657 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -36,7 +36,8 @@ if(istype(AM, mag_type)) if(magazine) user << "You perform a tactical reload on \the [src], replacing the magazine." - magazine.loc = get_turf(src.loc) + magazine.dropped() + magazine.forceMove(get_turf(src.loc)) magazine.update_icon() magazine = null else diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index a36ee4c3e61..52566ca25f9 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -35,7 +35,7 @@ var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here var/nodamage = 0 //Determines if the projectile will skip any damage inflictions var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb - var/projectile_type = "/obj/item/projectile" + var/projectile_type = /obj/item/projectile var/range = 50 //This will de-increment every step. When 0, it will delete the projectile. //Effects var/stun = 0 @@ -218,4 +218,4 @@ /obj/item/projectile/proc/dumbfire(var/dir) current = get_ranged_target_turf(src, dir, world.maxx) - fire() \ No newline at end of file + fire()